⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kruskal_disjoint_set.cpp

📁 最小生成树 MST的四种算法实现。 包括普通的Kruskal算法和Prim算法
💻 CPP
字号:
#include "mst.h"

int		father[maxn];
edge_t	edge[maxm], temp_edge[maxm];

int		root(int k)
{
	if (father[k] == k) return k;
	else {
		father[k] = root(father[k]);
		return father[k];
	}
}

bool	same(int a, int b)
{
	return root(a) == root(b);
}

void	merge(int a, int b)
{
	father[root(a)] = root(b);
}

int		cmp_len(const void *a, const void *b) {
	edge_t x = *(edge_t *) a;
	edge_t y = *(edge_t *) b;
	
	return (x.len-y.len);
}

void	kruskal_disjoint_set_read(int &n, int &m)
{
	int	i;

	freopen(inputfilename, "r", stdin);

	scanf("%d %d", &n, &m);
	for (i = 0; i < m; i++)
		scanf("%d %d %d", &edge[i].a, &edge[i].b, &edge[i].len);
	
	memcpy(temp_edge, edge, sizeof(edge));

	fclose(stdin);
}

int		kruskal_disjoint_set(int &n, int &m)
{
	int	i, sum, total;

	memcpy(edge, temp_edge, sizeof(temp_edge));
	qsort(edge, m, sizeof(edge_t), cmp_len);
	for (i = 0; i < n; i++) father[i] = i;

	sum = total = 0;
	for (i = 0; i < m; i++) {
		if (!same(edge[i].a, edge[i].b)) {
			sum += edge[i].len;
			merge(edge[i].a, edge[i].b);
			total ++;
		}
	}
	
	if (total == n-1)
		return sum;
	else
		return -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -