qz!!!
  • 板块灌水区
  • 楼主_Dreams_
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/29 10:09
  • 上次更新2024/8/29 17:17:49
查看原帖
qz!!!
941614
_Dreams_楼主2024/8/29 10:09

这里

代码:

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

typedef long long ll;
const int N = 2e3 + 10;//N的值可以修改
int m, n, k = 0, sum = 0;
struct edge {
	int u, v, w;
}e[N], mst[N];
bool cmp(edge a, edge b) {
	if (a.w < b.w) {
		return 1;
	} else {
		return 0;
	}
}
int fa[N];//并查集用的集合数组
int Find(int x) {
	if (fa[x] == x) {
		return x;
	} else {
		return fa[x] = Find(fa[x]);
	}
}
void Union(int a, int b) {
	int faa = Find(a);
	int fbb = Find(b);
	if (faa != fbb) {
		fa[fbb] = faa;
	}
}

int main() {
	cin >> n >> m;
	//每个点初始化 自成连通分量
	for (int i = 1; i <= n; i++) {
		fa[i] = i;
	}
	for (int i = 1; i <= m; i++) {
		cin >> e[i].u >> e[i].v >> e[i].w;
	}
	sort(e, e + m, cmp);
	//放边
	for (int i = 1; i <= m; i++) {
		//取一条边,看看这条边的两端是不是同一个连通分量
		if (Find(e[i].u) != Find(e[i].v)) {
			k++;
			mst[k].u = e[i].u;
			mst[k].v = e[i].v;
			mst[k].w = e[i].w;
			sum += e[i].w;
			//这条边的两端需要变成一个连通分量(集合)
			Union(e[i].u, e[i].v);
			if (k == n - 1) {
				break;
			}
		}
	}
	if (k < n - 1) {
		cout << "Orz"; 
	} else {
		cout << sum;
	}
	return 0;
}
2024/8/29 10:09
加载中...