最小生成树之克鲁斯卡尔算法

克鲁斯卡尔算法思想:
1.有个Struct定义边的信息.
2.通过并查集和排序找得到最小权值(函数:1.UFset,2.Find,3.Union。)
3.找到权值的最小值的父亲关系相同放弃,否拿下Kruskal;

4.一直把所有的点合成通过连通分量。

#define Max 2000000
#define Maxn 2000
struct edge
{
	int u,v;
	int w;
}edges[Max];

int parent[Maxn];
int n,m;
int i,j;
void UFset()
{
	for(i=0;i<=n;i++)
		parent[i]=i;
}
int Find(int x)
{
   if(x!=parent[x])
             parent[x]=Find(parent[x]);
   return parent[x];
}
void Union(int R1,int R2)
{

	int r1=Find(R1);
        int r2=Find(R2);
	parent[r1]=r2;
}
int cmp(const void * a,const void * b)  
{  
    return (*(struct edge *)a).w - (*(struct edge *)b).w;  
}  
int Kruskal()
{  
	int sumweight=0;
	int num=0;
	int u,v;
	UFset();
	for(i=0;i<m;i++)
	{
		u=edges[i].u;
		v=edges[i].v;
       
		if(Find(u)!=Find(v))
		{  
			
			sumweight+=edges[i].w;
			num++;
			Union(u,v);
		}
		if(num>=n-1)break;

	}
  return sumweight;
}
qsort(edges,m,sizeof(edges[0]),cmp);

通俗来说:从小到大的边权值寻找,一路不重复地加入新的最小权值,直到当前所有的点num大于n点加提前结束完。(当前是最优)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值