kruskal模板

include<iostream>
#include<algorithm>
using namespace std; 
struct Edge
{
int a,b;//边的两个顶点的编号
int d;//边的权值
}edge[11111];
int n,m,s;//n为无向图的顶点个数,m为边的条数,s用来存放最小生成树的总权值
int root[111];//存储父节点
bool cmp(Edge a,Edge b)
{
return a.d<b.d;
}
int find(int a)//寻找父节点
{
if(root[a]==a) return a;
return root[a]=find(root[a]);
}
bool Union(int a,int b,int d)//合并
{
if(a==b) return 0;//a==b说明边的两个顶点一属于同一颗树,
                     所以不需要合并,直接返回
root[a]=b;//将a的父节点更新为b,从而将树a,b合并成一棵树
s+=d;//将边的权值加到s当中
return 1;
}
void kruskal()
{
for(int i=0;i<n;i++)//初始化,将各顶点的父节点标记为本身
root[i]=i;
sort(edge,edge+m,cmp);//将所有边 根据边的权值 从小到大排列
                     s=0;
for(i=0;i<m;i++)//遍历所有的边
{
if(Union(find(edge[i].a),find(edge[i].b),edge[i].d))
n--;//当合并成功,森林的树就少一棵
}//当遍历完所有的边时,如果n!=1,说明该无向图不是连通图,不存在最小生成树
}

你可能感兴趣的:(kruskal模板)