最小生成树——Kruskal算法模板

Kruskal算法的思路

1.先将所有边按照权值从小到大排序
2.然后从小到大枚举每条边(u,v)
3.接下来会出现两种情况:
情况1:u和v在同一个连通分量中,加入(u,v)后会形成环,不可以选这条边(后面加入的边权值一定比前面加入的使u和v连通的边的权值大,所以放弃加入当前这条边)
情况2:如果u和v在不同的连通分量,则加入(u,v)(若不加这条边,后面加入的使u和v连通的边权值一定比当前边大,所以加入这条边结果不会更差)
4.加入n-1(n为顶点个数)后得到的图就是最小生成树了

Kruskal算法用于稀疏图时效率较高

Kruskal算法模板

时间复杂度为O(mlog2(m))

int w[maxn];
int r[maxn];
int p[maxn];
int v[maxn];
int u[maxn];

int cmp(const int i,const int j){return w[i]<w[j];}  //按照权值排序
int find(int x) {return p[x]==x?x:p[x]=find(p[x]);}  //路径压缩的并查集
int Kruskal{
	int ans=0;
	for(int i=0;i<n;i++) p[i]=i;  //初始化并查集
	for(int i=0;i<m;i++) r[i]=i;   //初始化边序号
	sort(r,r+m,cmp)   //将边排序
	for(int i=0;i<m;i++){
	int e=r[i];
	int x=find(u[e]);
	int y=find(v[e]);
	if(x!=y) {ans+=w[e];p[x]=y}
	}
	return ans;
	}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页