hdoj2544 最短路(Dijkstra || Floyd || SPFA)

题目链接

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

思路

最短路算法模板题,求解使用的Dijkstra算法、Floyd算法、SPFA算法可以当做求解最短路问题的模板使用。

代码

Dijkstra算法:

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6
 7 const int INF = 0x3f3f3f;
 8 const int N = 100 + 10;
 9 int map[N][N];
10 int dist[N];
11 int visit[N];
12 int n, m;
13
14 void dijkstra()
15 {
16     memset(visit, 0, sizeof(visit));
17     for (int i = 1; i <= n; i++)
18         dist[i] = map[1][i];
19     dist[1] = 0;
20     int min_dist, now;
21     for (int i = 1; i <= n; i++)
22     {
23         min_dist = INF;
24         for (int j = 1; j <= n; j++)
25         {
26             if (!visit[j] && dist[j] < min_dist)
27             {
28                 min_dist = dist[j];
29                 now = j;
30             }
31         }
32         if (min_dist == INF) break;
33         visit[now] = 1;
34         for (int j = 1; j <= n; j++)
35         {
36             if (dist[now] + map[now][j] < dist[j])
37                 dist[j] = dist[now] + map[now][j];
38         }
39     }
40     printf("%d\n", dist[n]);
41 }
42
43 int main()
44 {
45     //freopen("hdoj2544.txt", "r", stdin);
46     while (scanf("%d%d", &n, &m) == 2 && n)
47     {
48         memset(map, INF, sizeof(map));
49         int a, b, c;
50         for (int i = 0; i < m; i++)
51         {
52             scanf("%d%d%d", &a, &b, &c);
53             map[a][b] = map[b][a] = c;
54         }
55         dijkstra();
56     }
57     return 0;
58 }

Floyd算法:

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6
 7 const int INF = 0x3f3f3f;
 8 const int N = 100 + 10;
 9 int map[N][N];
10 int n, m;
11
12 void floyd()
13 {
14     for (int k = 1; k <= n; k++)
15         for (int i = 1; i <= n; i++)
16             for (int j = 1;j <= n; j++)
17                 map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
18     printf("%d\n", map[1][n]);
19 }
20
21 int main()
22 {
23     //freopen("hdoj2544.txt", "r", stdin);
24     while (scanf("%d%d", &n, &m) == 2 && n)
25     {
26         memset(map, INF, sizeof(map));
27         int a, b, c;
28         for (int i = 0; i < m; i++)
29         {
30             scanf("%d%d%d", &a, &b, &c);
31             map[a][b] = map[b][a] = c;
32         }
33         floyd();
34     }
35     return 0;
36 }

SPAF算法:

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <queue>
 6 #include <vector>
 7 using namespace std;
 8
 9 struct Edge
10 {
11     int s, e, dist;    //边的起点、终点、长度
12
13     Edge() {}
14     Edge(int s, int e, int d) :s(s), e(e), dist(d) {}
15 };
16
17 const int INF = 0x3f3f3f;
18 const int N = 100 + 10;
19 vector<Edge> v[N];    //使用邻接表存储图
20 int dist[N];
21 int visit[N];
22 int n, m;
23
24 void spfa(int s)
25 {
26     queue<int> q;
27     memset(dist, INF, sizeof(dist));
28     memset(visit, 0, sizeof(visit));
29     q.push(s);
30     visit[s] = 1;
31     dist[s] = 0;
32
33     while (!q.empty())
34     {
35         int s = q.front();
36         q.pop();
37         visit[s] = 0;
38         for (int i = 0; i < v[s].size(); i++)
39         {
40             int e = v[s][i].e;
41             if (dist[e] > dist[s] + v[s][i].dist)
42             {
43                 dist[e] = dist[s] + v[s][i].dist;
44                 if (visit[e] == 0)
45                 {
46                     visit[e] = 1;
47                     q.push(e);
48                 }
49             }
50         }
51     }
52     printf("%d\n", dist[n]);
53 }
54
55 int main()
56 {
57     //freopen("hdoj2544.txt", "r", stdin);
58     while (scanf("%d%d", &n, &m) == 2 && n)
59     {
60         for (int i = 1;i <= n; i++)
61             v[i].clear();
62         int a, b, c;
63         for (int i = 0; i < m; i++)
64         {
65             scanf("%d%d%d", &a, &b, &c);
66             v[a].push_back(Edge(a, b, c));
67             v[b].push_back(Edge(b, a, c));
68         }
69         spfa(1);    //求结点1到其余各点的最短路径
70     }
71     return 0;
72 }
时间: 2024-12-19 07:47:38

hdoj2544 最短路(Dijkstra || Floyd || SPFA)的相关文章

HDU - 2544 - 最短路 (最基础单源最短路问题!!dijkstra+floyd+SPFA)

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

最短路--Dijkstra&amp;&amp;Floyed&amp;&amp;SPFA

最短路径是一个很常见的问题,这里有3种方法,可供参考. 一.Dijkstra#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int a[101][3]; double c[101]; bool b[101]; double f[101][101]; int n,i,j,k,x,y,m,s,e; double minl; dou

ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在于状态转移方程的确立和SPFA的过程 1 //最短路:Floyd+SPFA(BFS)+DP 2 //Time:20Ms Memory:336K 3 //题目很好,数据较弱,网上部分代码有些问题却能够A掉 4 //题意:超级马里奥要从A+B处背着公主以最短路程到达1处,其中1-A是村庄,剩下的是城堡

hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点.请你计算出要从起点到终点,最短须要行走多少距离. Input 本题目包括多组数据,请处理到文件结束. 每组数据第一行包括两个正整数N和M(0< N<200,0 < M<1000),分别代表现有城镇的数目和已

dijkstra,SPFA,Floyd求最短路

Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k]} STEP2:把顶点k加入集合1中,同时修改集合2中的剩余顶点j的d[j]是否经过k之后变短,若变短则修改d[j]; if d[k]+a[k,j]<d[j] then   d[j]=d[k]+a[k,j]; STEP3:重复STEP1,直到集合2为空为止. #include <iostream&

ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28761    Accepted Submissio

HDU 2544:最短路( 最短路径入门 &amp;&amp;Dijkstra &amp;&amp; floyd )

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

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n,树根为编号1,选择一些边,使得所有节点构成一棵树,选择边的代价是(子孙的点的重量)×(这条边的价值).求代价最小多少. 分析: 单看每个点被计算过的代价,很明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 不过坑点还是很多的. 点的数量高达5w个,用矩阵存不行,只能用边存. 还有路径和结

杭电1874-畅通工程续(最短路径,dijkstra,spfa,floyd)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 37458    Accepted Submission(s): 13826 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行