C语言实现最小生成树之克鲁斯卡尔算法

该博客介绍了使用C语言实现克鲁斯卡尔算法来找到图的最小生成树。难点在于判断边的添加是否会形成环以及保持图的连通性。通过遍历上三角矩阵存储边信息,按权值排序,然后依次连接权值最小的边,同时检查是否形成环。通过调整父节点确保连通性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图示

在这里插入图片描述
在这里插入图片描述
难点是:当选择最后一条边时,v2-v3是5,v1-v4也是5,但是v1-v4一旦连上就会出现环且这个图不是连通图,所以在代码中如何判断环的出现和保证最小生成树是连通的?

代码

//定义一个结构体记录生成树一条边的起始顶点和终止顶点,还有相应的权值的信息
typedef struct Edge
{
   
	int x; // start
	int y; // end
	E   cost;
}Edge;

int cmp(const void*a, const void *b)//比较权值的大小
{
   
	return (*(Edge*)a).cost - (*(Edge*)b).cost;//转化类型后取权值
}

bool Is_same(int *father, int i, int j)//判断是否是相同的集合
{
   
	while(father[i] != i)
	{
   
		i = father[i];
	}
	while(father[j] != j)
	{
   
		j = father[j];
	}
	return i==j;
}
void Mark_same(int *father, int i, int j)//标记为相同的集合
{
   
	while(father[i] != i)
	{
   
		i = father[i];
	}
	while(father[j] != j)
	{
   
		j = father[j];
	}
	father[j] = i;
}


//最小生成树的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值