您的位置:首页 > 其它

hdu 2066 一个人的旅行

2011-03-07 11:09 369 查看
#include<stdio.h>
int inf = 0x7fffffff;
int map[1024][1024],des[1024],dis[1024],s,max,t,d,a[1024],b[1024];
int Dijkstra(  )
{
++max;
for( int i = 1; i <= d; ++i )
map[b[i]][max] = map[max][b[i]] = 0;
dis[0] = 0;
for( int i = 0; i <= max; ++i )
{
int min = inf,pos = -1,t;
for( int j = 0; j <= max; ++j )//寻找当前的最短路
{
if( !des[j] )
if( dis[j] != inf )
if( dis[j] < min )
{
min = dis[j];
pos = j;
}
}
des[pos] = 1;
for( int j = 0; j <= max; ++j )//更新于当前最短路相连的节点
{
if( !des[j] )
if( map[pos][j] != inf )
if( ( t = dis[pos] + map[pos][j] ) < dis[j] )
{
dis[j] = t;
}
}
}
int min = inf;
for( int i = 1; i <= d; ++i )
min = min < dis[b[i]] ? min :dis[b[i]];
return min;
}
int main( )
{
while( scanf( "%d%d%d",&t,&s,&d ) != EOF )
{
for( int i = 0; i <= 1010; ++i )
{
for( int j = 0; j <= 1010; ++j )
map[i][j] = inf;
des[i] = 0;
dis[i] = inf;
}
for( int i = 1; i <= t; ++i )
{
int x,y,v;
scanf( "%d%d%d",&x,&y,&v );
if( v < map[x][y] )//一直wa的所在地
map[x][y] = map[y][x] = v;
y = y > x ? y: x;
max = max > y ?max: y;
}
for( int i = 1; i <= s; ++i )
{
scanf( "%d",&a[i] );
map[0][a[i]] = map[a[i]][0] = 0;
}
for( int j = 1; j <= d; ++j )
{
scanf( "%d",&b[j] );
}
printf( "%d\n",Dijkstra() );
}
return 0;
}

      

这题我开始偷懒,用floyd做果断超时,后来用Dijkstra做仍然wa,最后看了旭的代码后发现少了一个判断语句,代码中有提示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: