Prim算法是解决最小生成树的经典算法(尤以稠密图效率很高),现对这样一道简单最小生成 题目给出完整代码。
输入n和m,代表n个节点,m条边,然后是m行输入,每行有x,y,z,代表x到y的路距离为z。问题:能使各点联通的最短路径是多少。
测试样例:
/*
10 12
1 4 1
1 5 1
1 6 1
4 8 1
4 3 1
3 5 1
5 7 1
3 7 1
6 2 1
7 2 1
7 10 1
2 9 1
*/
直接给出AC代码。
复制代码
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#include<cstdio> #include<cstring> const int maxn=100; int n,m; int map[maxn][maxn]; int dis[maxn]; bool vis[maxn]; int path[maxn]; int prim() { memset(dis,0x3f,sizeof(dis)); //快速初始化为无穷大 memset(vis,0,sizeof(vis)); int ans=0; dis[1]=0; while(1) { int k=0; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<dis[k]) //这一步找未收录顶点中dist值最小的 k=j; //没有未收录的顶点,则返回(顶点从1开始,k为0一定是没找到) } if(!k) break; vis[k]=1; //收录顶点k ans+=dis[k]; for(int j=1;j<=n;j++) { if(dis[j]>map[k][j]) { dis[j]=map[k][j]; path[j]=k; } } } return ans; } void print(int x) { if(x==-1) return ; print(path[x]); printf("%d->",x); } int main() { int x,y,z; memset(map,0x3f,sizeof(map)); memset(path,-1,sizeof(path)); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); map[x][y]=map[y][x]=z; } printf("%dn",prim()); for(int i=1;i<=n;i++) { print(path[i]); printf("%dn",i); } return 0; }
/*
10 12
1 4 1
1 5 1
1 6 1
4 8 1
4 3 1
3 5 1
5 7 1
3 7 1
6 2 1
7 2 1
7 10 1
2 9 1
*/
10 12
1 4 1
1 5 1
1 6 1
4 8 1
4 3 1
3 5 1
5 7 1
3 7 1
6 2 1
7 2 1
7 10 1
2 9 1
*/
最后
以上就是犹豫魔镜最近收集整理的关于经典Prim算法题目及代码的全部内容,更多相关经典Prim算法题目及代码内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复