最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合
2016-10-14 20:34
447 查看
//最小生成树
//输入边 定义边节点
//kruskal算法
//map 的struct需要定义< 符号 ,那么set也应该是这样但是数组可以不用
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000;
int num;//边数
struct Node{
int r,l,e;
bool operator < (const Node& rhs) const{
return e<rhs.e;
}
}node[maxn];
int ufs[maxn];
int ans=0;
int find(int u){
return ufs[u]==u? u:ufs[u]=find(ufs[u]);
}
void Kruskal(){
sort(node,node+num);
for(int i=0;i<maxn;i++)ufs[i]=i;//自连通
for(int i=0;i<num;i++){
int x=find(node[i].l);
int y=find(node[i].r);
if(x!=y){
ans+=node[i].e;
printf("edge start with %d,end with %d, length %d\n",node[i].l,node[i].r,node[i].e);
ufs[x]=y;
}
}
}
int main(){
//输入树节点,起点,终点,边权
cout<<"input the num of the edge of the tree:\n";
cin>>num;
cout<<"for the next n lines input as a-the begin b-the end e-the length:\n";
for(int i=0;i<num;i++){
cin>>node[i].l>>node[i].r>>node[i].e;
}
//kruskal算法求最小生成树并打印最小生成树
Kruskal();
printf("The smallest:%d",ans);
return 0;
}
//输入边 定义边节点
//kruskal算法
//map 的struct需要定义< 符号 ,那么set也应该是这样但是数组可以不用
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000;
int num;//边数
struct Node{
int r,l,e;
bool operator < (const Node& rhs) const{
return e<rhs.e;
}
}node[maxn];
int ufs[maxn];
int ans=0;
int find(int u){
return ufs[u]==u? u:ufs[u]=find(ufs[u]);
}
void Kruskal(){
sort(node,node+num);
for(int i=0;i<maxn;i++)ufs[i]=i;//自连通
for(int i=0;i<num;i++){
int x=find(node[i].l);
int y=find(node[i].r);
if(x!=y){
ans+=node[i].e;
printf("edge start with %d,end with %d, length %d\n",node[i].l,node[i].r,node[i].e);
ufs[x]=y;
}
}
}
int main(){
//输入树节点,起点,终点,边权
cout<<"input the num of the edge of the tree:\n";
cin>>num;
cout<<"for the next n lines input as a-the begin b-the end e-the length:\n";
for(int i=0;i<num;i++){
cin>>node[i].l>>node[i].r>>node[i].e;
}
//kruskal算法求最小生成树并打印最小生成树
Kruskal();
printf("The smallest:%d",ans);
return 0;
}
相关文章推荐
- 图 之 MST(最小生成树 — kruskal算法 )并查集实现
- POJ 1861 Network [最小生成树算法MST-kruskal 数据结构-并查集 union-find sets]
- HDU-4313 Matrix 最小生成树,集合划分
- 最小生成树kruskal算法并查集版 C语言实现
- 最小生成树总结(prim、并查集和kruskal) C++实现
- 由最小生成树(MST)到并查集(UF)
- 最小生成树Kruskal算法+并查集实现
- GOOGLE的一道笔试题—求给定连通无环无向图可以生成的最小高度树
- 最小生成树kruskal算法并查集版 C语言实现
- 【并查集 最小生成树两种模板(MST)】
- HDU1863 - 畅通工程 最小生成树的并查集方法实现
- Prim算法实现最小生成树MST
- HDU 1233 (最小生成树) 用并查集实现kruskal
- 最小生成树之Kruskal(并查集实现)
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解
- PKU1611--并查集Kruskar算法实现最小生成树源码
- HDU-1863(最小生成树+并查集判断是否连通)
- GOOGLE的一道笔试题—求给定连通无环无向图可以生成的最小高度树
- 由最小生成树(MST)到并查集(UF)
- 最小生成树(MST)三种实现方法C++版本