最小生成树基础
来源:互联网 发布:微信截图软件 编辑:程序博客网 时间:2024/05/13 13:07
课本内容小改动~
prim算法:
#include<cstdio>#include<cstdlib>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<algorithm>#include<iomanip>#include<cstring>#include<string>#include<iostream>const int MAXN=100+10;const int INF=999999;using namespace std;int G[MAXN][MAXN];int cp[MAXN];int dis[MAXN];int sum;void prim(int n, int v){ int i,j; for(i=0; i<n; i++){ dis[i]=G[v][i]; cp[i]=v; } for(i=1; i<n; i++){ int min=INF; int k=v; for(j=0; j<n; j++){ if(dis[j] && dis[j]<min){ min=dis[j]; k=j; } }printf("%d <-> %d = %d\n", cp[k], k, min);//打印两顶点与两点间权值 sum+=dis[k];//计算最短路径和 dis[k]=0;//加入集合 for(j=0; j<n; j++){ if(G[j][k] && G[j][k]<dis[j]){//更新候选边 dis[j]=G[j][k]; cp[j]=k; } } } printf("%d\n", sum);}int main(){ //freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d", &n,&m), n+m)//节点为0~n-1 { sum=0; int i,j; for(i=0; i<n; i++){//初始化图 for(j=0; j<n; j++){ if(i==j){ G[i][j]=0; continue;} G[i][j]=INF; } } for(i=1; i<=m; i++){ int u,v,w; scanf("%d%d%d", &u,&v,&w); G[u][v]=w; G[v][u]=w; } prim(n, 0); } return 0;}
kruskal算法:
#include<cstdio>#include<cstdlib>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<algorithm>#include<cstring>#include<string>#include<iostream>const int MAXN=5000+10;const int INF=99999;using namespace std;int fa[101];int sum;typedef struct edge{ int u,v,w;}*Edge;bool cmd(edge e1, edge e2){ return e1.w<e2.w;}int find(int x){ if(fa[x]==x) return x; return fa[x]=find(fa[x]);}void kruskal(int n, Edge E){ int k=1,j=0; int u1,v1,c1,c2; for(int i=1; i<=n; i++) fa[i]=i; while(k<n)//n个点只需要找n-1条边 { u1=E[j].u; v1=E[j].v; c1=find(u1); c2=find(v1); if(c1!=c2){//u1与v1属于不同的集合 fa[c1]=c2;//合并 k++; sum+=E[j].w;cout<<u1<<" <-> "<<v1<<" = "<<E[j].w<<endl;//打印方案 } j++; } printf("%d\n", sum);}int main(){ freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d", &n,&m), n+m) { edge E[MAXN]; sum=0; int i,j; j=0; for(i=1; i<=m; i++){ scanf("%d%d%d", &E[j].u,&E[j].v,&E[j].w); j++; } sort(E, E+j, cmd);//按所有边的权值升序排序 kruskal(n, E); } return 0;}
感觉会用并查集的话,kruskal算法比较容易理解。。。
0 0
- 【基础】最小生成树
- 最小生成树基础
- 最小生成树基础
- Prim基础最小生成树
- Kruskal基础最小生成树
- POJ1258 基础最小生成树
- hdu1863 最小生成树基础
- 最小生成树基础-----HDOJ1863
- 最小生成树基础算法
- 基础最小生成树代码留存
- poj 1251 最小生成树基础
- 算法基础 - 最小生成树(Prim算法)
- 算法基础 - 最小生成树(Kruscal算法)
- POJ_2395_Out of Hay【基础最小生成树】
- 算法基础篇(8)------最小生成树
- LeetCode基础-图-最小生成树
- poj 2485 Highways prim最小生成树 基础 球最小生成树中得最大边
- 2349 Arctic Network prim最小生成树 基础
- 字符串匹配
- Spket在Eclipse/MyEclipse下的安装和配置(图文教程)
- Ant教程
- hduoj2009(求数列的和)
- cocos2dx之保存截屏图片
- 最小生成树基础
- Unix/Linux环境C编程入门教程(36) 初识shell
- hdu2009 求数列的和
- HDU 3395Special Fish 最“大”费用最大流
- 第一篇Java笔记
- 浅析C#Image类
- Deep Learning 系列(3):CNN(卷积神经网络)
- 总结的全球范围内的计算机视觉牛人 2
- poj 2356