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