hdoj2544 最短路(Dijkstra || Floyd || SPFA)
2017-12-04 15:59
549 查看
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2544
思路
最短路算法模板题,求解使用的Dijkstra算法、Floyd算法、SPFA算法可以当做求解最短路问题的模板使用。
代码
Dijkstra算法:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int INF = 0x3f3f3f; const int N = 100 + 10; int map ; int dist ; int visit ; int n, m; void dijkstra() { memset(visit, 0, sizeof(visit)); for (int i = 1; i <= n; i++) dist[i] = map[1][i]; dist[1] = 0; int min_dist, now; for (int i = 1; i <= n; i++) { min_dist = INF; for (int j = 1; j <= n; j++) { if (!visit[j] && dist[j] < min_dist) { min_dist = dist[j]; now = j; } } if (min_dist == INF) break; visit[now] = 1; for (int j = 1; j <= n; j++) //“松弛”操作 { if (dist[now] + map[now][j] < dist[j]) dist[j] = dist[now] + map[now][j]; } } printf("%d\n", dist ); } int main() { //freopen("hdoj2544.txt", "r", stdin); while (scanf("%d%d", &n, &m) == 2 && n) { memset(map, INF, sizeof(map)); int a, b, c; for (int i = 0; i < m; i++) { scanf("%d%d%d", &a, &b, &c); map[a][b] = map[b][a] = c; } dijkstra(); } return 0; }
Floyd算法:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int INF = 0x3f3f3f; const int N = 100 + 10; int map ; int n, m; void floyd() { for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1;j <= n; j++) map[i][j] = min(map[i][j], map[i][k] + map[k][j]); printf("%d\n", map[1] ); } int main() { //freopen("hdoj2544.txt", "r", stdin); while (scanf("%d%d", &n, &m) == 2 && n) { memset(map, INF, sizeof(map)); int a, b, c; for (int i = 0; i < m; i++) { scanf("%d%d%d", &a, &b, &c); map[a][b] = map[b][a] = c; } floyd(); } return 0; }
SPAF算法:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <vector> using namespace std; struct Edge { int s, e, dist; //边的起点、终点、长度 Edge() {} Edge(int s, int e, int d) :s(s), e(e), dist(d) {} }; const int INF = 0x3f3f3f; const int N = 100 + 10; vector<Edge> v ; //使用邻接表存储图 int dist ; int visit ; int n, m; void spfa(int s) { queue<int> q; memset(dist, INF, sizeof(dist)); memset(visit, 0, sizeof(visit)); q.push(s); visit[s] = 1; dist[s] = 0; while (!q.empty()) { int s = q.front(); q.pop(); visit[s] = 0; for (int i = 0; i < v[s].size(); i++) { int e = v[s][i].e; if (dist[e] > dist[s] + v[s][i].dist) { dist[e] = dist[s] + v[s][i].dist; if (visit[e] == 0) { visit[e] = 1; q.push(e); } } } } printf("%d\n", dist ); } int main() { //freopen("hdoj2544.txt", "r", stdin); while (scanf("%d%d", &n, &m) == 2 && n) { for (int i = 1;i <= n; i++) v[i].clear(); int a, b, c; for (int i = 0; i < m; i++) { scanf("%d%d%d", &a, &b, &c); v[a].push_back(Edge(a, b, c)); v[b].push_back(Edge(b, a, c)); } spfa(1); //求结点1到其余各点的最短路径 } return 0; }
相关文章推荐
- hdoj-2544 最短路【最短路径--dijkstra&&spfa&&floyd】
- hdoj 2544 最短路【dijkstra、floyd、spfa】
- HDOJ 2544 最短路 (最短路 Dijkstra && SPFA && Floyd)
- HDU 2544 最短路(dijkstra or Floyd or bellman or spfa )
- HDU 2544 最短路【dijkstra+floyd+spfa+bellman-ford】
- Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法汇总 HDU 2544为例
- HDU 2544 最短路(四种写法:Floyd、Dijkstra、Bellman-Ford、SPFA)
- HDU 2544 最短路(Floyd + Dijkstra + SPFA + 使用链式前向星优化的SPFA + 浅谈最短路)
- HDOJ 1869 六度分离 (最短路 Dijkstra && SPFA && Floyd)
- HDU-#2544 最短路(Dijkstra、Floyd、Bellman-Ford、SPFA)
- hdu-2544-最短路(Dijkstra + Dijkstra优先队列 + Bellman-ford + SPFA +Floyd) 纯模板题
- HDOJ2544 最短路(Dijkstra,floyd,模板)
- HDU - 2544 - 最短路 (最基础单源最短路问题!!dijkstra+floyd+SPFA)
- HDU 2544-最短路(SPFA,Dijkstra,Floyd)
- HDU 2544 最短路(dijkstra,Floyd,spfa)
- Hdu 2544 最短路 (Dijkstra+SPFA+Floyd模板)
- HDOJ 1874 畅通工程续 (最短路 Dijkstra && SPFA && Floyd)
- HDU2544---最短路(dijkstra&&floyd&&spfa)
- [dijkstra/SPFA/floyd]HDU 2544最短路
- hdoj 2544 最短路 【SPFA】