复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102#include <stdio.h> #include <algorithm> #include <stdlib.h> #include <string.h> #include <iostream> #include <queue> using namespace std; typedef long long LL; const int N = 1000; const int INF = 0x3f3f3f3f; int dis[N], G[N][N], n, s; bool vis[N]; void dijkstra() { for(int i = 1; i <= n; i++) dis[i] = G[1][i];//代表起点到各个节点的距离 dis[1] = 0; for(int i = 1; i <= n; i++)//这里也可以事先标记起点已访问,然后遍历n-1个节点,找到离1号顶点最近的顶点 { int k = -1; for(int j = 1; j <= n; j++) { if(!vis[j] && (k==-1 || dis[j]<dis[k])) k = j; } if(k == -1) break;//已经遍历所有的点 vis[k] = true; for(int j = 1; j <= n; j++) { if(!vis[j]) dis[j] = min(dis[j], dis[k]+G[k][j]); } } printf("%dn", dis[n]); } void floyd() { for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) G[i][j] = min(G[i][j], G[i][k]+G[k][j]); printf("%dn", G[1][n]); } void spfa() { queue<int>que; for(int i = 1; i <= n; i++) dis[i] = INF;//初值记得赋无穷,而不是G数组中的值! dis[1] = 0; vis[1] = true; que.push(1); while(!que.empty()) { int now = que.front(); que.pop(); vis[now] = false;//记得还原!! for(int i = 1; i <= n; i++) { if(dis[now]+G[now][i]<dis[i]) { dis[i] = dis[now]+G[now][i]; if(!vis[i]) { vis[i] = true; que.push(i); } } } } printf("%dn", dis[n]); } int main() { // freopen("in.txt", "r", stdin); int m, e, w; while(~scanf("%d%d", &n, &m) &&(n+m)) { memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { if(i == j) G[i][j] = 0; else G[i][j] = INF; } for(int i = 1; i <= m; i++) { scanf("%d%d%d", &s, &e, &w); G[s][e] = G[e][s] = w; } // dijkstra(); // floyd(); spfa(); } return 0; }
最后
以上就是怡然季节最近收集整理的关于hdu 2544 最短路(Floyd || dijkstra || spfa )模板的全部内容,更多相关hdu内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复