最小生成树 kruskal(算法)
来源:互联网 发布:云计算应用的发展方向 编辑:程序博客网 时间:2024/05/20 11:32
最小生成树:
图中有好多点呀(n个),让我们找到n-1条边,来把他们连上吧,但是要让这n-1条边的和最小。
kruskal算法:
把所有边由升序排列,然后从最小的一条边找起,如果这条边的两点不属于一个集合(此处运用并查集),那么就要这条边,否则,忽略这条边吧~
一直这样找下去,直到找了n-1条边为止,此时,最小生成树出来了。
同理,可以求最大生成树。
code:
#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;#define MX 100000struct point{int in,out;int leth;}eg[1000];int n,m,pre[50];bool cmp(point a,point b){return a.leth<b.leth; //只要降序返回,即为最大生成树。}int find(int w){int root=w,now;while(root!=pre[root])root=pre[root];while(root!=pre[w]){now=pre[w];pre[w]=root;w=now;}return root;}int main(){//freopen("in.in","r",stdin);//freopen("out.out","w",stdout);while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<=n;i++)pre[i]=i;for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&eg[i].in,&eg[i].out,&eg[i].leth);}int sum=0,k=0;sort(eg,eg+m,cmp);for(int i=0;i<m;i++){int x,y;x=find(eg[i].in);y=find(eg[i].out);if(x!=y){pre[y]=x;sum+=eg[i].leth;k++;}if(k==n-1)break;}printf("%d\n",sum);}return 0;}
- 最小生成树算法(prim&kruskal)
- poj1251最小生成树(kruskal算法)
- 最小生成树 kruskal(算法)
- 最小生成树(Kruskal算法)--poj2421
- 最小生成树(kruskal算法)
- 最小生成树(Kruskal算法)
- Kruskal算法(求最小生成树)
- 最小生成树2(Kruskal算法)
- 最小生成树算法(2)------------Kruskal
- Kruskal 算法(最小生成树)
- 最小生成树算法[Prime/(Kruskal)]
- 最小生成树(二)...Kruskal算法
- kruskal最小生成树(MST)算法
- 最小生成树(kruskal算法)
- 最小生成树-Kruskal算法(模板)
- 最小生成树(Kruskal算法)
- 最小生成树(Kruskal算法)
- 最小生成树(Kruskal算法)模板
- QTP 11 破解
- Pear 安装注意事项
- C语言病毒
- Android 如何防止代码被反编译
- 美科学家称噬菌体未来可为新型手机电池
- 最小生成树 kruskal(算法)
- easyui插件用法
- 别以为有vpn我找不到你(网警抓人全过程)
- SQL Sever生成修改所有字段排序规则
- 验证码的生成与验证1-------两个页面搞定
- C# int 转换为byte 的浅析
- SQL Server uniqueidentifier如此存储成Hex
- C++一些要点
- Android布局之屏幕自适应