kruscal算法实现

达到的


#include <iostream>
#include <algorithm>
using namespace std;
int trank[100];
int n,m,U[100],V[100],W[100],R[100];
int A[100];
int par[100];
void make_set(int n)
{
	for(int i=1;i<=n;i++)
	{
		par[i]=i;
		trank[i]=0;
	}
}
/*int  find(int x)
{
	//return set[x]==x?x:set[x]=find(set[x]);
	if(set[x]==x) return x;
	else {set[x]=find(set[x]);return find(set[x]);}//这里有瑕疵,每次调次函数只更新一次set【】
}*/
int find(int x)
{
	return par[x]==x?x:par[x]=find(par[x]);
}
void Union(int x,int y)
{
	x=find(x);
	y=find(y);
	if(trank[x]>trank[y])
	{
		par[y]=x;//y为头目;x为集合名
	}
	else if(trank[x]<trank[y])
	{
		par[x]=y;
	}
	else trank[x]++;
}
int cmp(int i,int j)
{
	if(W[i]<W[j]) return true;
}
void mst_kruskal()
{
	make_set(n);
	for(int i=1;i<=m;i++)
		R[i]=i;
	sort(R,R+m,cmp);
	for(int i=1;i<=m;i++)
	{
		if(find(U[R[i]])!=find(V[R[i]]))
		{
			A[i]=R[i];
			Union(U[R[i]],V[R[i]]);
		}
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值