HDOJ 3790 最短路径问题 SPFA
因为没有对边判重,白白WA了好几次,注意输入时必须要对边判重
AC 187MS 8100K
1 #include <queue> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <memory.h> 5 using namespace std; 6 7 const int maxn = 1001; 8 const int INF = 0x3F3F3F3F; 9 10 int a, b, d, p, nNum, mNum; 11 int dist[maxn], px[maxn], QM[maxn]; 12 int cost[maxn][maxn], g[maxn][maxn]; 13 14 void spfa(int sx, int tx) 15 { 16 int xx; 17 queue <int> q; 18 19 q.push(sx); 20 QM[sx]=1, dist[sx]=0, px[sx]=0; 21 22 while (!q.empty()) 23 { 24 xx = q.front(); 25 q.pop(); 26 QM[xx] = 0; /* Took Away */ 27 28 for (int i=1; i<=nNum; ++i) 29 { 30 if (dist[i] > dist[xx]+g[xx][i]) 31 { 32 dist[i] = dist[xx] + g[xx][i]; 33 px[i] = px[xx] + cost[xx][i]; 34 35 if (QM[i] == 0) 36 { 37 QM[i] = 1; 38 q.push(i); 39 } 40 }/* End of if */ 41 else if (dist[i]==dist[xx]+g[xx][i] 42 && px[i]>px[xx]+cost[xx][i]) 43 { 44 px[i] = px[xx] + cost[xx][i]; 45 } 46 }/* End of For */ 47 }/* End of While */ 48 49 printf("%d %d\n", dist[tx], px[tx]); 50 }/* spfa */ 51 52 int main() 53 { 54 while (~scanf("%d %d", &nNum, &mNum), nNum+mNum!=0) 55 { 56 for (int i=1; i<=nNum; ++i) 57 { 58 QM[i] = 0; 59 px[i] = dist[i] = INF; 60 61 for (int j=1; j<=nNum; ++j) 62 g[i][j] = cost[i][j] = INF; 63 }/* End of For */ 64 65 for (int i=1; i<=mNum; ++i) 66 { 67 scanf("%d %d %d %d", &a, &b, &d, &p); 68 69 if (d < g[a][b]) /* 判重 */ 70 { 71 g[a][b] = g[b][a] = d; 72 cost[a][b] = cost[b][a] = p; 73 } 74 }/* End of For */ 75 76 int sx, tx; 77 78 scanf("%d %d", &sx, &tx); 79 spfa(sx, tx); 80 }/* End of While */ 81 82 return 0; 83 }