HDU ACM 3790 最短路径问题 (SPFA)
http://acm.hdu.edu.cn/showproblem.php?pid=3790
注意要求的是最短路径的最小费用有双重权值.
1.求最短路径.
2.求最短路径所需要的钱数.若有多条最短路径则要找出花钱最少那条.
所以要有种松弛.
1 if(map[mid][i].len + dis[mid].len < dis[i].len) 2 { 3 dis[i].len = map[mid][i].len + dis[mid].len; 4 dis[i].money = map[mid][i].money + dis[mid].money; 5 if(!used[i]) 6 { 7 q.push(i); 8 used[i] = 1; 9 } 10 } 11 if(map[mid][i].len + dis[mid].len == dis[i].len && dis[i].money > map[mid][i].money + dis[mid].money) 12 { 13 dis[i].money = map[mid][i].money + dis[mid].money; 14 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 const int MAX = 1100; 5 const int INF = 0x3fffffff; 6 struct Node 7 { 8 int len; 9 int money; 10 }; 11 Node map[MAX][MAX]; 12 Node dis[MAX]; 13 bool used[MAX]; 14 Node SPFA(int start,int end,int n) 15 { 16 int i; 17 for(i=1;i<=n;i++) 18 { 19 dis[i].len = INF; 20 dis[i].money = INF; 21 } 22 dis[start].len = 0; 23 dis[start].money = 0; 24 queue <int> q; 25 q.push(start); 26 used[start] = 1; 27 while(!q.empty()) 28 { 29 int mid; 30 mid = q.front(); 31 q.pop(); 32 used[mid] = 0; 33 for(i=1;i<=n;i++) 34 { 35 if(map[mid][i].len + dis[mid].len < dis[i].len) 36 { 37 dis[i].len = map[mid][i].len + dis[mid].len; 38 dis[i].money = map[mid][i].money + dis[mid].money; 39 if(!used[i]) 40 { 41 q.push(i); 42 used[i] = 1; 43 } 44 } 45 if(map[mid][i].len + dis[mid].len == dis[i].len && dis[i].money > map[mid][i].money + dis[mid].money) 46 { 47 dis[i].money = map[mid][i].money + dis[mid].money; 48 } 49 } 50 } 51 return dis[end]; 52 } 53 int main() 54 { 55 int n,m; 56 while(scanf("%d%d",&n,&m),n+m) 57 { 58 int i,j; 59 for(i=1;i<MAX;i++) 60 { 61 for(j=1;j<MAX;j++) 62 { 63 map[i][j].len = INF; 64 map[i][j].money = INF; 65 } 66 } 67 memset(used,0,sizeof(used)); 68 for(i=0;i<m;i++) 69 { 70 int a,b,c,d; 71 scanf("%d%d%d%d",&a,&b,&c,&d); 72 if(c < map[a][b].len) 73 { 74 map[a][b].len = c; 75 map[b][a].len = c; 76 map[a][b].money = d; 77 map[b][a].money = d; 78 } 79 } 80 int s,e; 81 scanf("%d%d",&s,&e); 82 Node x = SPFA(s,e,n); 83 printf("%d %d\n",x.len ,x.money); 84 } 85 return 0; 86 }