hdu1546-Idiomatic Phrases Gamehttp

来源:互联网 发布:成都蜀美网络 编辑:程序博客网 时间:2024/05/21 08:36

http://acm.hdu.edu.cn/showproblem.php?pid=1546

Dijkstra求解最短路,但是题意中规定当某一字符串的首尾字符相同时才能连接,但是使用如下的方法,这个条件就被忽略了(暗含已经判断了);

题意大致为给定一个整数  和一串字符串,当字符串末端的四个字符与另一字符串的首端四个字符相同时,加上前面的字符串,然后找出连接状态的最小值,而且每一个符合条件的字符串的首尾字符必须相同,才能相加;

将题目转换成求解最短路,然后处理一下对于字符串和对应的整数的关系就可以求出来了

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std ; const int INF = 1000000000 ;const int maxn = 1005 ;int edge[ maxn ][ maxn ] ;int path[ maxn ] ; int dist[ maxn ] ;int used[ maxn ] ;int n ;int temp[ maxn ] ;char str[ maxn ][ maxn ] ;void Dijkstra( int v0 ){int i , j , k ; memset( used , 0 , sizeof( used ) ) ;for( i = 0 ; i < n ; i++ ){dist[ i ] = INF ;}dist[ 0 ] = 0 ;for( i = 0 ; i < n ; i++){int MIN = INF , u = v0 ;for( j = 0 ; j < n ; j++ ){if( !used[ j ]  && dist[ j ] < MIN ){MIN = dist[ j ] ;u = j ;}}used[ u ] =  1; for( k = 0 ; k < n ; k++ ){if( edge[ u ][ k ] != -1 && (edge[ u ][ k ] + dist[ u ] < dist[ k ] )){dist[ k ] = dist[ u ] + edge[ u ][ k ] ;path[ k ] = u ;}}}}int main(){int i , j , k ;while( scanf( "%d" , &n ) != EOF && n ){memset( temp , 0 , sizeof( temp ) ) ;memset( str , 0 , sizeof( str ) ) ;for( i = 0 ; i < n ; i++ )scanf( "%d%s" , &temp[ i ] , str[ i ] ) ;memset( edge , -1 ,sizeof( edge ) ) ;for( i = 0 ; i < n ; i++ ){for( j = 0 ; j < n ; j++ ){if( i == j )continue ;int len = strlen( str[ i ] ) ;for( k = 0 ; k < 4 ; k++ ){if( str[ i ][ len - 4 + k ] != str[ j ][ k ] )break; }if( k == 4 )edge[ i ][ j ] = temp[ i ] ;}}Dijkstra( 0 ) ; if( dist[ n - 1  ] == INF )printf( "-1\n" ) ;elseprintf( "%d\n" ,dist[ n - 1  ] ) ;}}