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             }

 

//View Code
 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 }

 

posted @ 2012-09-04 15:21  zx雄  阅读(587)  评论(0编辑  收藏  举报