HDOJ3790 最短路径问题[Dijkstra算法||SPFA]

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4820    Accepted Submission(s): 1446


Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 
Output
输出 一行有两个数, 最短距离及其花费。
 
Sample Input
3 2 1 2 5 6 2 3 4 5 1 3 0 0
 
Sample Output
9 11
 
Source
 
Recommend
notonlysuccess
 
 
 
 
 
 
前面一直WA,后来才发现不能用INT_MAX来赋值,还找了好久的问题,以后注意了!!!
code:
  1 #include <iostream>   
  2 #include <iomanip>   
  3 #include <fstream>   
  4 #include <sstream>   
  5 #include <algorithm>   
  6 #include <string>   
  7 #include <set>   
  8 #include <utility>   
  9 #include <queue>   
 10 #include <stack>   
 11 #include <list>   
 12 #include <vector>   
 13 #include <cstdio>   
 14 #include <cstdlib>   
 15 #include <cstring>   
 16 #include <cmath>   
 17 #include <ctime>   
 18 #include <ctype.h> 
 19 using namespace std;
 20 
 21 #define MAXN 1010
 22 
 23 int n,m;
 24 int s,t;
 25 int dist[MAXN];
 26 int disc[MAXN];
 27 int mapt[MAXN][MAXN];
 28 int mapc[MAXN][MAXN];
 29 int vst[MAXN];
 30 
 31 void Dijkstra()
 32 {
 33     int i,j,k;
 34     for(i=1;i<=n;i++)
 35     {
 36         dist[i]=mapt[s][i];
 37         disc[i]=mapc[s][i];
 38         vst[i]=0;
 39     }
 40     vst[s]=1;
 41     dist[s]=0;
 42     disc[s]=0;
 43     for(i=2;i<=n;i++)
 44     {
 45         k=s;
 46         int lowdis=99999;
 47         for(j=1;j<=n;j++)
 48             if(!vst[j]&&dist[j]<lowdis)
 49             {
 50                 k=j;
 51                 lowdis=dist[j];
 52             }
 53         if(lowdis==99999)
 54             break;
 55         vst[k]=1;
 56         for(j=1;j<=n;j++)
 57         {
 58             if(!vst[j])
 59             {
 60                 if(dist[j]>mapt[k][j]+dist[k])
 61                 {
 62                     dist[j]=mapt[k][j]+dist[k];
 63                     disc[j]=mapc[k][j]+disc[k];
 64                   }
 65                 else if(dist[j]==mapt[k][j]+dist[k])
 66                 {
 67                     if(disc[j]>mapc[k][j]+disc[k])
 68                         disc[j]=mapc[k][j]+disc[k];
 69                 }
 70             }
 71         }
 72     }
 73 }
 74 
 75 int main()
 76 {
 77     int i,j;
 78     int a,b,d,p;
 79     while(~scanf("%d%d",&n,&m),n&&m)
 80     {
 81         for(i=1;i<=MAXN;i++)
 82             for(j=1;j<=MAXN;j++)
 83             {
 84                 mapt[i][j]=99999;
 85                 mapc[i][j]=99999;
 86             }
 87         for(i=1;i<=m;i++)
 88         {
 89             scanf("%d%d%d%d",&a,&b,&d,&p);
 90             if(d<mapt[a][b])
 91             {
 92                 mapt[a][b]=mapt[b][a]=d;
 93                  mapc[a][b]=mapc[b][a]=p;
 94             }
 95             else if(d==mapt[a][b])
 96             {
 97                 if(p<mapc[a][b])
 98                     mapc[a][b]=mapc[b][a]=p;
 99             }
100         }
101         scanf("%d%d",&s,&t);
102         Dijkstra();
103         printf("%d %d\n",dist[t],disc[t]);
104     }
105     return 0;
106 }

SPFA

code:

 1 #include <iostream>   
 2 #include <iomanip>   
 3 #include <fstream>   
 4 #include <sstream>   
 5 #include <algorithm>   
 6 #include <string>   
 7 #include <set>   
 8 #include <utility>   
 9 #include <queue>   
10 #include <stack>   
11 #include <list>   
12 #include <vector>   
13 #include <cstdio>   
14 #include <cstdlib>   
15 #include <cstring>   
16 #include <cmath>   
17 #include <ctime>   
18 #include <ctype.h> 
19 using namespace std;
20 
21 #define MAXN 1010
22 #define intmax 99999999
23 
24 int map[MAXN][MAXN];
25 int dis[MAXN];
26 int cost[MAXN][MAXN];
27 int QM[MAXN];
28 int px[MAXN];       //费用
29 int n,m;
30 
31 void init()
32 {
33     int i,j;
34     for(i=1;i<=n;i++)
35     {
36         QM[i]=0;
37         px[i]=dis[i]=intmax;
38         for(j=1;j<=n;j++)
39             cost[i][j]=map[i][j]=intmax;
40     }
41 }
42 
43 void spfa(int sx,int ex)
44 {
45     int i,j;
46     queue<int>Que;
47     int temp;
48     Que.push(sx);
49     QM[sx]=1;
50     dis[sx]=0;
51     px[sx]=0;
52     while(!Que.empty())
53     {
54         temp=Que.front();
55         Que.pop();
56         QM[temp]=0;
57         for(i=1;i<=n;i++)
58         {
59             if(dis[i]>dis[temp]+map[temp][i])
60             {
61                 dis[i]=dis[temp]+map[temp][i];
62                 px[i]=px[temp]+cost[temp][i];
63                 if(QM[i]==0)
64                 {
65                     QM[i]=1;
66                     Que.push(i);
67                 }
68             }
69             else if(dis[i]==dis[temp]+map[temp][i]&&px[i]>px[temp]+cost[temp][i])
70             {
71                 px[i]=px[temp]+cost[temp][i];
72             }
73         }
74     }
75     printf("%d %d\n",dis[ex],px[ex]);
76 }
77 
78 int main()
79 {
80     int a,b,d,p;
81     while(~scanf("%d%d",&n,&m),n||m)
82     {
83         init();
84         for(int i=1;i<=m;i++)
85         {
86             scanf("%d%d%d%d",&a,&b,&d,&p);
87             if(d<map[a][b])
88             {
89                 map[a][b]=map[b][a]=d;
90                 cost[a][b]=cost[b][a]=p;
91             }
92         }
93         int st,et;
94         scanf("%d%d",&st,&et);
95         spfa(st,et);
96     }
97     return 0;
98 }
原文地址:https://www.cnblogs.com/XBWer/p/2622422.html