一、注意点
二、模板
struct edge{
int u,v; //边的两个端点
int cost; //边权
}E[MAXV]; //最多有MAXE条边
bool cmp(edge a,edge b)
{
return a.cost<b.cost;
}
int father[N];//并查集数组
int findFather(int x){//并查集查询函数
……
}
//kruskal函数返回最小生成树的边权之和,参数n为顶点个数,m为图的边数
int kruskal(int n,int m)
{
//ans为所求边权之和,Num_Edge为当前生成树的边数
int ans=0,Num_Edge=0;
for(int i=1;i<n;i++)//假设题目中顶点范围是[1,n]
{
father[i]=i;//并查集初始化
}
sort(E,E+m,cmp);//所有边按边权从小到大排序
for(int i=0;i<m;i++)//枚举所有边
{
int faU=findFather(E[i].u);//查询测试边两个端点所在集合的根节点
int faV=findFather(E[i].v);
if(faU!=faV)//如果不在一个集合中
{
father[faU]=faV;//合并集合,即把测试边加入最小生成树
ans+=E[i].cost;//边权之和增加测试边的边权
Num_Edge++;//当前生成树的边数加一
if(Num_Edge==n-1)break;//边数等于顶点数减1时结束算法
}
}
if(Num_Edge!=n-1)return -1;//无法连通时返回-1
else return ans;//返回最小生成树的边权之和
}
三、适用问题
适用于稀疏图,边数少。