Kruskal算法c++实现

本文介绍了一种基于集合避圈法的最小生成树算法实现,通过使用C++编程语言,详细展示了如何构建邻接矩阵,对边集数组进行排序,并利用Kruskal算法求解最小生成树。该算法以边为主导,从某一条边出发,避免形成环路,最终得到权值最小的树。
//集合避圈法,以边为主导,从某一条边出发
#include<iostream>
using namespace std;
const int maxnum = 100;
typedef struct edge {
	int u;
	int v;
	int w;
	edge()
	{

	}
	edge(int ui, int vi, int wi)
	{
		u = ui;
		v = vi;
		w = wi;
	}
}edge;
int nodeset[maxnum];
int vexnums;
int edgenums;	
edge e[maxnum];
int cmp(const void *a, const void *b)
{
	edge* e1 = (edge*)a;
	edge* e2 = (edge*)b;
	return e1->w - e2->w;
}
//构建邻接矩阵
void CreateGraph() {
	cout << "输入顶点数量和边数量:" << endl;
	cin >> vexnums >> edgenums;
	cout << "输入对应的边关系:" << endl;
	for (int i = 0; i < edgenums; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		e[i] = edge(u, v, w);
	}
	//对边集数组进行排序
	qsort(e, edgenums, sizeof(e[0]), cmp);
	for (int i = 1; i <= vexnums; i++)
	{
		nodeset[i] = i;
	}
}
//合并顶点集合
int Merge(int u,int v) //默认情况下边u-v,u对应的是更新的顶点编号
{
	int up = nodeset[u];
	int vp = nodeset[v];
	if (up == vp) return 0;
	for (int i = 1; i <= vexnums; i++)
	{
		if (nodeset[i] == vp)
			nodeset[i] = up;
	}
	return 1;
}
void Kruskal() 
{
	int ans = 0,n = vexnums;
	for (int i = 0; i < edgenums; i++)
	{
		if (Merge(e[i].u, e[i].v))
		{
			ans += e[i].w;
			n--;
			cout << "n:" << n << " i:" << i<<endl;	
			if (n == 1)
			{
				cout << ans << endl;
				return;
			}
		}
	}
}
int main()
{
	CreateGraph();
	Kruskal();
	return 0;
}

测试用例:

7 12
1 2 23
1 7 36
1 6 28
2 7 1
2 3 20
3 7 4
3 4 15
4 7 9
4 5 3
5 6 17
5 7 16
6 7 25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值