hdu 3790 最短路径问题
今天的这题有点悲剧,错就错在一个地方,在输入距离的时候,我把花费也考虑进去了,结果一只wa,没办法,看了大牛的代码才知道只要考虑距离;
#include<stdio.h>
int n,m,s,t;
int inf = 0x7fffffff,des[1024],dis[1024],map[1024][1024];
int co[1024],cost[1024][1024];
void Dijkstra( )
{
for( int i = 1; i <= n; ++i )
{
dis[i] = co[i] = inf;
des[i] = 0;
}
dis[s] = co[s] = 0;
for( int i = 1; i <= n; ++i )
{
int min = inf,pos = 0;
for( int j = 1; j <= n ; ++j )
{
if( !des[j] )
if( dis[j] < min )
{
pos = j;
min = dis[j];
}
}
des[pos] = 1;
if( min == inf )
break;
for( int j = 1; j <= n; ++j )
{
int p,q;
if( !des[j] )
if( map[pos][j] != inf )
if( p = map[pos][j] + dis[pos],p < dis[j] )
{
dis[j] = p;
co[j] = co[pos] + cost[pos][j];
}
else if( p == dis[j] )
{
if( q = cost[pos][j] + co[pos],q < co[j] )
co[j] = co[pos] + cost[pos][j];
}
}
}
}
int main( )
{
while( scanf( "%d%d",&n,&m ) , n|m )
{
for( int i = 0 ; i <= n; ++i )
{
for( int j = 0; j <= n; ++j )
{
map[i][j] = cost[i][j] = inf;
}
}
for( int i = 0; i < m; ++i )
{
int x,y,d,p;
scanf( "%d%d%d%d",&x,&y,&d,&p );
if( map[x][y] >= d )
{
map[x][y] = map[y][x] = d;
cost[x][y] = cost[y][x] = p;
}
}
scanf( "%d%d",&s,&t );
Dijkstra( );
printf( "%d %d\n",dis[t],co[t] );
}
return 0;
}
原先的错误代码
#include<stdio.h>
int n,m,s,t;
int inf = 0x7fffffff,des[1024],dis[1024],map[1024][1024];
int co[1024],cost[1024][1024];
void Dijkstra( )
{
for( int i = 1; i <= n; ++i )
{
dis[i] = co[i] = inf;
des[i] = 0;
}
dis[s] = co[s] = 0;
for( int i = 1; i <= n; ++i )
{
int min = inf,pos = 0;
for( int j = 1; j <= n ; ++j )
{
if( !des[j] )
if( dis[j] < min )
{
pos = j;
min = dis[j];
}
}
des[pos] = 1;
if( min == inf )
break;
for( int j = 1; j <= n; ++j )
{
int p,q;
if( !des[j] )
if( map[pos][j] != inf )
if( p = map[pos][j] + dis[pos],p < dis[j] )
{
dis[j] = p;
co[j] = co[pos] + cost[pos][j];
}
else if( p == dis[j] )
{
if( q = cost[pos][j] + co[pos],q < co[j] )
co[j] = co[pos] + cost[pos][j];
}
}
}
}
int main( )
{
while( scanf( "%d%d",&n,&m ) , n|m )
{
for( int i = 0 ; i <= n; ++i )
{
for( int j = 0; j <= n; ++j )
{
map[i][j] = cost[i][j] = inf;
}
}
for( int i = 0; i < m; ++i )
{
int x,y,d,p;
scanf( "%d%d%d%d",&x,&y,&d,&p );
if( map[x][y] >= d && cost[x][y] >= p )
{
map[x][y] = map[y][x] = d;
cost[x][y] = cost[y][x] = p;
}
}
scanf( "%d%d",&s,&t );
Dijkstra( );
printf( "%d %d\n",dis[t],co[t] );
}
return 0;
}
本人还是新手 ,转载请注明来自Lvsi‘s home
浙公网安备 33010602011771号