图论 - 树论 - 生成树 - Kruskal

图论 - 树论 - 生成树 - Kruskal

题目链接: https://www.luogu.org/problem/P3366

代码:

#include <bits/stdc++.h>

using namespace std;

const int N = 5010;

const int M = 200010;

int n, m;

int tot, head[N], fa[N];

struct Edge {
	int u, v, val;
} e[M];

bool cmp(Edge A, Edge B) {
	return A.val < B.val;
}

int find(int x) {
	if (fa[x] == x) {
		return x;
	}
	return fa[x] = find(fa[x]);
}
int Kruskal() {
	sort(e + 1, e + m + 1, cmp);
	int cnt = 0, ret = 0;
	for (int i = 1; i <= m; i ++ ) {
		int fx = find(e[i].u);
		int fy = find(e[i].v);
		if (fx == fy) {
			continue ;
		}
		fa[fx] = fy;
		cnt ++ ;
		ret += e[i].val;
	}
	if (cnt == n - 1) {
		return ret ;
	}
	return -1;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i ++ ) {
		fa[i] = i;	
	}
	for (int i = 1; i <= m; i ++ ) {
		scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].val);
	}
	int ans = Kruskal();
	if (ans == -1) {
		puts("orz");
		return 0;
	}
	printf("%d\n", ans);
	return 0;
}

posted @ 2019-11-14 08:58  筱柒_Littleseven  阅读(92)  评论(0编辑  收藏  举报