算法分析与实践1-2 kruskal算法求最小生成树

KRUSKAL算法构造最小生成树

1.问题描述

假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。

2.kruskal算法的计算过程

新建图G,G中拥有原图中相同的节点,但没有边;
将原图中所有的边按权值从小到大排序;
从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中;
重复3,直至图G中所有的节点都在同一个连通分量中。

3.图像表示

4. 代码实现

struct graph
{
	int u,v,cost;
	void set(int a,int b,int w){u=a,v=b,cost=w;}
 } ;
 
 graph d[N*(N+1)/2];

int father[N];
int Find(int x)
{
	if (father[x]==-1) return x;
	return father[x] = Find(father[x]);
}

bool Union(int x, int y)
{
	x = Find(x);
	y = Find(y);
	if (x==y) return false;
	if (x>y) father[x] = y;
	if (x<y) father[y] = x;
	return true;
}

int cmp(graph x,graph y)
{
	if (x.cost<y.cost) return true;
	return false;
}

5. 源码地址

https://github.com/adamlallana77/-/blob/master/Kruskal%E7%AE%97%E6%B3%95.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值