经典Prim算法题目及代码
来源:互联网 发布:诺基亚5310xm软件 编辑:程序博客网 时间:2024/05/22 14:57
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代码。
#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("%d\n",prim()); for(int i=1;i<=n;i++) { print(path[i]); printf("%d\n",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
*/
阅读全文
1 0
- 经典Prim算法题目及代码
- 经典dijkstra算法题目及代码
- 经典算法之Prim算法
- Prim 算法代码例子
- Prim算法代码
- prim算法 伪代码
- prim算法简单代码
- 一些经典算法题目
- 经典算法题目收集
- 经典算法题目
- 题目1024:畅通工程 朴素Prim算法
- prim算法简介及实现
- prim经典算法求最小生成树
- 图论 经典prim算法(MST)
- DP算法的经典题目
- 【九章算法】经典题目
- 算法:动态规划经典题目
- 几个经典基础算法题目
- 线程池
- JQuery 元素位置
- Service流程
- 在Node.js中实现文件复制的方法和实例
- contenteditable="true"的div事件处理
- 经典Prim算法题目及代码
- 机器学习深度学习基础笔记(4)——Backpropagation算法实现
- 安卓中MVC模式的深度思索和实践(三)
- linux环境高级编程之fork、getpid、getppid函数
- 关于jquery中toggle()方法的替换
- 六大数据采集工具
- 两个CentOS系统之间的NFS网络文件系统使用
- Python json dumps() && loads()
- ORA-12541:TNS:无监听程序