HDU 3790 最短路径问题 Dijkstra

http://acm.hdu.edu.cn/showproblem.php?pid=3790

题意:

  普通的最短路问题,只不过加了个费用,在有多条最短路的情况下输出花费最少的那组答案.(双重权值)

 

坑爹:

  有重边的情况,开始做的时候当判断重边比原来小的时候,还去判断费用是不是比原来小..这样就会出错..是在找最短路径的前提下找到最小的花费.

disprice数组和dis数组同步操作,但对dis进行松弛的时候,如果经过另一条路径在到目的地就要比较这两条路哪变的费用少.

 

解法:

  用个Dijkstra算法将dis和disprice进行松弛解出答案.

View Code
 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxn = 10000 + 10;
 5 const int INF = 0x3fffffff;
 6 int map[maxn][maxn];
 7 int price[maxn][maxn];
 8 int dis[maxn];
 9 int disprice[maxn];
10 int used[maxn];
11 int N;
12 int M;
13 int start;
14 int over;
15 
16 void init()
17 {
18     int i;
19     int j;
20     for(i=0; i<=N; i++)
21     {
22         for(j=0; j<=N; j++)
23         {
24             map[i][j]=INF;
25             price[i][j]=INF;
26         }
27     }
28 }
29 
30 void Dijkstra()
31 {
32     int i;
33     for(i=0; i<=N; i++)
34     {
35         dis[i]=INF;
36         disprice[i]=INF;
37     }
38     dis[start]=0;
39     disprice[start]=0;
40     int j;
41     for(j=0; j<N; j++)
42     {
43         int min=INF;
44         int minnode;
45         for(i=1; i<=N; i++)
46         {
47             if(dis[i]<min && !used[i])
48             {
49                 min=dis[i];
50                 minnode=i;
51             }
52         }
53         used[minnode]=1;
54         for(i=1; i<=N; i++)
55         {
56             if(dis[i]>dis[minnode]+map[minnode][i] && !used[i])
57             {
58                 dis[i]=dis[minnode]+map[minnode][i];
59                 disprice[i]=disprice[minnode]+price[minnode][i];
60             }
61             if(dis[i]==dis[minnode]+map[minnode][i] && !used[i])
62             {
63                 if(disprice[i]>disprice[minnode]+price[minnode][i])
64                 {
65                     disprice[i]=disprice[minnode]+price[minnode][i];
66                 }
67             }
68         }
69     }
70 }
71 
72 int main()
73 {
74     while(cin>>N>>M,N+M)
75     {
76         init();
77         memset(used,0,sizeof(used));
78         while(M--)
79         {
80             int a;
81             int b;
82             int d;
83             int p;
84             cin>>a>>b>>d>>p;
85             if(d<map[a][b])
86             {
87                 map[a][b]=d;
88                 map[b][a]=d;
89                 price[a][b]=p;
90                 price[b][a]=p;
91             }
92         }
93         cin>>start>>over;
94         Dijkstra();
95         cout<<dis[over]<<" "<<disprice[over]<<endl;
96     }
97     return 0;
98 }

 

posted @ 2012-09-05 00:40  pc....  阅读(196)  评论(0)    收藏  举报