hdu 2112 HDU Today
这题真恼火,写完代码后自己测试都能过,就是wa,于是我把代码重新敲了一遍,没想到还是wa,最后只能去找大牛的代码,大牛都是用字典树做的,显然与我的不符,最后在自己的代码上改,终于改到一个地方,在初始化的时候全部从0开始初始化,果断水过
#include<stdio.h>
#include<string.h>
char word[160][300] = {0},a[300],b[300],start[300],end[300],p,q;
int map[160][160],c,des[160],dis[160],n;
int inf = 0x7fffffff;
int obtain( char str[] )//将地名用数字代替
{
int f = 1,pos = 0;
for( int i = 2 ; i <= c; ++i )
{
if( !strcmp( word[i],str ) )
{
f = 0;
pos = i;
break;
}
}
if( f )
{
++c;
strcpy( word[c],str );
pos = c;
}
return pos;
}
int Dijkstra( )
{
int i ;
dis[p] = 0;
for( i = 1; i <= c; ++i )
{
int min = inf,pos = 0;
for( int j = 1; j <= c; ++j )
{
if( !des[j] )
if( dis[j] != inf )
if( min > dis[j] )
{
min = dis[j];
pos = j;
}
}
des[pos] = 1;
if( des[q] )
return dis[q];
for( int j = 1; j <= c; ++j )
{
int t;
if( !des[j] )
if( map[pos][j] != inf )
if( ( t = map[pos][j] + dis[pos] ) < dis[j] )
{
dis[j] = t;
}
}
}
if( i > c )
return -1;
}
int main( )
{
while( scanf( "%d",&n ) , n != -1 )
{
c = 0;
memset( word,160,sizeof( word[0][0] ) );
for( int i = 0; i <= 155; ++i )
{
for( int j = 0; j <= 155; ++j )
map[i][j] = inf;
des[i] = 0;
dis[i] = inf;
}
scanf( "%s%s",start,end );
for( int i = 1; i <= n; ++i )
{
int x,y,val;
scanf( "%s%s%d",a,b,&val );
x = obtain( a );
y = obtain( b );
if( val < map[x][y] && x != y )
map[x][y] = map[y][x] = val;
}
p = obtain ( start );
q = obtain ( end );
if( q == p )
{
printf( "0\n" );
continue;
}
int res = Dijkstra();
printf( "%d\n",res );
}
return 0;
}
本人还是新手 ,转载请注明来自Lvsi‘s home
浙公网安备 33010602011771号