码迷,mamicode.com
首页 > 编程语言 > 详细

HDU 2544 最短路 Dijkstra、Floyd、Bellman-Ford、SPFA算法

时间:2015-09-02 20:33:30      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2544

 

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 43669    Accepted Submission(s): 19216

Problem Description

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

 

Input

输 入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店 所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B& lt;=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

 

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

 

Sample Input

2 1

1 2 3

3 3

1 2 5

2 3 5

3 1 2

0 0

 

Sample Output

3

2

 

技术分享
 1 #include <cstdio>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 200, INF = 0x3f3f3f3f;
 6 int edge[N][N];
 7 int Dijkstra(int n)
 8 {
 9     int D[N], tag;
10     bool vis[N] = {0};
11     memcpy(D, edge[0], sizeof(D));
12     vis[0] = true;
13     for(int i=0; i<n; ++i)
14     {
15         tag = 0;
16         for(int j=0; j<n; ++j)
17             if(!vis[j])
18                 tag = D[j] < D[tag] ? j : tag;
19         vis[tag] = true;
20         for(int j=0; j<n; ++j)
21             if(!vis[j])
22                 D[j] = min(D[j], D[tag] + edge[tag][j]);
23     }
24     return D[n-1];
25 }
26 int main(void)
27 {
28     int n, m, from, to, d;
29     while(scanf("%d %d", &n, &m), n+m)
30     {
31         memset(edge, INF, sizeof(edge));
32         for(int i=0; i<m; ++i)
33         {
34             scanf("%d %d %d", &from, &to, &d);
35             --from, --to;
36             edge[from][to] = edge[to][from] = min(edge[from][to], d);
37         }
38         printf("%d\n", Dijkstra(n));
39     }
40 }
Dijkstra
技术分享
 1 #include <cstdio>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 200, INF = 0x3f3f3f3f;
 6 int edge[N][N];
 7 int floyd(int n)
 8 {
 9     for(int k=0; k<n; ++k)
10         for(int i=0; i<n; ++i)
11             for(int j=0; j<n; ++j)
12                 edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j]);
13     return edge[0][n-1];
14 }
15 int main(void)
16 {
17     int n, m, from, to, d;
18     while(scanf("%d %d", &n, &m), n+m)
19     {
20         memset(edge, INF, sizeof(edge));
21         for(int i=0; i<m; ++i)
22         {
23             scanf("%d %d %d", &from, &to, &d);
24             --from, --to;
25             edge[from][to] = edge[to][from] = min(edge[from][to], d);
26         }
27         printf("%d\n", floyd(n));
28     }
29 }
Floyd
技术分享
 1 #include <cstdio>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int N = 200, M = 11000, INF = 0x3f3f3f3f;
 7 int from[M], to[M], edge[M];
 8 int bellman(int n, int m)
 9 {
10     int D[N], a, b;
11     memset(D, INF, sizeof(D));
12     D[0] = 0;
13     for(int i=1; i<n; ++i)
14     {
15         for(int j=0; j<m; ++j)
16         {
17             a = from[j];
18             b = to[j];
19             D[b] = min(D[b], D[a] + edge[j]);
20         }
21     }
22     return D[n-1];
23 }
24 int main(void)
25 {
26     int n, m, num, a, b, c;
27     while(scanf("%d %d", &n, &m), n+m)
28     {
29         num = 0;
30         for(int i=0; i<m; ++i)
31         {
32             scanf("%d %d %d", &a, &b, &c);
33             --a, --b;
34             from[num] = a;
35             to[num] = b;
36             edge[num++] = c;
37             from[num] = b;
38             to[num] = a;
39             edge[num++] = c;
40         }
41         printf("%d\n", bellman(n, num));
42     }
43 }
Bellman-Ford
技术分享
 1 #include <cstdio>
 2 #include <string.h>
 3 #include <deque>
 4 using namespace std;
 5 const int N = 200, M = 1e4+100, INF = 0x3f3f3f3f;
 6 int u[M], v[M], w[M], Next[M], first[N];
 7 int SPFA(int n)
 8 {
 9     int D[N], x, t;
10     bool cnt[N] = {0};
11     memset(D, INF, sizeof(D));
12     D[0] = 0;
13     cnt[0] = true;
14     deque<int> dq;
15     dq.push_front(0);
16     while(!dq.empty())
17     {
18         t = dq.front();
19         dq.pop_front();
20         for(int x=first[t]; ~x; x=Next[x])
21         {
22             if(D[v[x]] > D[u[x]] + w[x])
23             {
24                 D[v[x]] = D[u[x]] + w[x];
25                 if(!cnt[v[x]])
26                 {
27                     if(!dq.empty() && D[v[x]] < D[dq.front()])
28                         dq.push_front(v[x]);
29                     else
30                         dq.push_back(v[x]);
31                     cnt[v[x]] = true;
32                 }
33             }
34         }
35         cnt[t] = false;
36     }
37     return D[n-1];
38 }
39 int main(void)
40 {
41     int n, m, num;
42     while(scanf("%d %d", &n, &m), n+m)
43     {
44         memset(first, -1, sizeof(first));
45         num = 0;
46         for(int i=0; i<m; ++i)
47         {
48             scanf("%d %d %d", u+num, v+num, w+num);
49             --u[num], --v[num];
50             Next[num] = first[u[num]];
51             first[u[num]] = num++;
52             u[num] = v[num-1], v[num] = u[num-1], w[num] = w[num-1];
53             Next[num] = first[u[num]];
54             first[u[num]] = num++;
55         }
56         printf("%d\n", SPFA(n));
57     }
58 }
SPFA

 

HDU 2544 最短路 Dijkstra、Floyd、Bellman-Ford、SPFA算法

标签:

原文地址:http://www.cnblogs.com/gwtan/p/4779274.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!