Kruskal 10分求条(玄关)
查看原帖
Kruskal 10分求条(玄关)
1384733
slch楼主2025/7/23 11:25

我的评测记录

我的代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 10005;
struct edge {
	int p1, p2;
	int weight;

	friend istream& operator>>(istream& is, edge& e) {
		is >> e.p1 >> e.p2 >> e.weight;
		return is;
	}
};
bool cmp(edge a, edge b) {
	return a.weight < b.weight;
}

edge arr[N];
int prt[N];
int n, m;

int root(int u) {
	if (prt[u] == u)
		return prt[u];
	prt[u] = root(prt[u]);
	return prt[u];
}

bool merge(int u, int v) {
	int r1 = root(u), r2 = root(v);
	if (r1 == r2) return false;
	prt[r1] = r2;
	return true;
}

bool kruskal(long long& sum) {
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		if (cnt == n - 1)
			return true;
		if (merge(arr[i].p1, arr[i].p2)) {
			sum += arr[i].weight;
			cnt++;
		}
	}
	return false;
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> arr[i];
	}
	for (int i = 1; i <= n; i++)
		prt[i] = i;
	sort(arr + 1, arr + n + 1, cmp);

	long long sum = 0;
	if (kruskal(sum)) {
		cout << sum << endl;
	} else
        puts("orz");

	return 0;
}
2025/7/23 11:25
加载中...