您的位置:首页 > 其它

zoj2750-Idiomatic Phrases Game

2013-05-13 23:27 381 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1750

#include<stdio.h>
#include<string.h>
#define MAXN 1000
#define INF 1000000000

struct idiom
{
char front[ 5 ] ,back [ 5 ] ;
int T ;
};
idiom dic[ MAXN ];
int Edge[ MAXN ][ MAXN] ;
int dist[ MAXN ] ;
int S[ MAXN ] ;
int N ;

int main()
{
int  i , j , k ;
char s[ 100 ] ;
int len ;
while( scanf( "%d" ,&N ) != EOF )
{
if( N == 0 )
break;
for( k = 0 ; k < N ; k++ )
{
scanf( "%d%s" , &dic[ k ].T  , s  ) ;
len = strlen ( s ) ;
for( i = 0 , j = len - 1; i < 4 ; i++ , j-- )
{
dic[ k ].front[ i ] = s[ i ] ;
dic[ k ].back[ 3 - i ] = s[ j ] ;
}
dic[ k ].back[4] = dic[ k ].front[ 4 ] = '\0' ;
}
for( i = 0 ; i < N ; i++ )
{
for( j = 0 ; j < N ; j++ )
{
Edge[ i ][ j ] = INF ;
if( i == j )
continue ;
if( strcmp( dic[ i ].back , dic[ j ].front ) == 0 )
Edge[ i ][ j ] = dic[ i ].T ;
}
}

for( i = 0 ; i < N ; i++ )
{
dist[ i ] = Edge[ 0 ][ i ] ;
S[ i ] =  0 ;
}
S[ 0 ] = 1 ;
dist[ 0 ] =  0 ;
for( i = 0 ; i < N - 1; i++ )
{
int min = INF ;
int u = 0 ;
for( j = 0 ; j < N ; j++ )
{
if( !S[ j ] && dist[ j ] < min )
{
u = j ;
min = dist[ j ] ;
}
}
S[ u ] = 1 ;
for( k = 0 ; k < N ; k++ )
{
if( !S[ k ] && Edge[ u ][ k ] < INF && Edge[ u ][ k ] + dist[ u ] < dist[ k ] )
dist[ k ] = dist[ u ] + Edge[ u ][ k ] ;
}
}
if( dist[ N - 1] == INF )
printf( "-1\n" ) ;
else
printf( "%d\n" , dist[ N -1 ] );
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: