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

原题地址: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

时间: 2024-12-28 23:54:27

HDU 2544 最短路 Dijkstra、Floyd、Bellman-Ford、SPFA算法的相关文章

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

hdu 2544 最短路 Dijkstra

题目链接: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): 35043 Accepted Submission

hdu 2544 最短路(Dijkstra Or Floyd Or dfs)

Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包

hdu 2544 最短路 dijkstra模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 38804    Accepted Submission(s): 16925 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最

HDU 2544最短路dijkstra模板题

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33657    Accepted Submission(s): 14617 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

HDU 2544 最短路(Floyd算法)

分析:最短路模板题,没有相关的路径求解 1 #include"iostream" 2 #define INF 65535 3 using namespace std; 4 const int maxn=100+10; 5 int w[maxn][maxn],d[maxn][maxn],n,m; 6 void Floyd() 7 { 8 for(int i=1;i<=n;i++) 9 for(int j=1;j<=n;j++) 10 d[i][j]=w[i][j]; 11 f

hdu 2544 最短路 (dijkstra,floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int n,Min,node[105],visit[105],map[105][105]; 5 void set() 6 { 7 for (int i=1; i<=n; i

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

hdu 2544 最短路 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目意思:给出 n 个路口和 m 条路,每一条路需要 c 分钟走过.问从路口 1 到路口 n 需要的最短时间是多少. 这题是最短路的入门题,从理解d-i--j---k(wg自创的,呵呵)到默打到修改,搞左两日终于好了,哈哈哈~~~太感动了. 第一次错是 少了Dijkstra()函数中的 for (j = 1; j <= n; j++) . 第二次错是把vis[k=j]=1 写在了 if (!v