站外题目求助
  • 板块学术版
  • 楼主__ikun__horro__
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/3/6 20:00
  • 上次更新2023/10/23 22:50:42
查看原帖
站外题目求助
607705
__ikun__horro__楼主2023/3/6 20:00

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define N 2000005
using namespace std;
long long n, m, k, v[N];
long long par[N];
struct Edge {
	long long u, v, w;
	bool friend operator < (const Edge &x, const Edge &y) {
		return x.w < y.w;
	}
} e[N];
void init() {
	for (long long i = 0; i <= n; i++) {
		par[i] = i;
	}
}
long long find(long long x) {
	return (par[x] == x ? x : par[x] = find(par[x]));
}
void unite(long long x, long long y) {
	x = find(x), y = find(y);
	if (x == y) return;
	par[x] = y;
}
bool same(long long x, long long y) {
	return find(x) == find(y);
}
long long kruscal() {
	long long res = 0, cnt = 0;
	sort(e + 1, e + k + 1);
	for (long long i = 1; i <= k; i++) {
		long long u = e[i].u, v = e[i].v, w = e[i].w;
		if (same(u, v)) continue;
		unite(u, v);
		res += w;
		cnt++;
		if (cnt == n) break;
	}
	return res;
}
signed main() {
	scanf("%lld%lld", &n, &m);
	init();
	for (long long i = 1; i <= n; i++) {
		scanf("%lld", &v[i]);
	}
	for (long long i = 1; i <= n; i++) {
		for (long long j = i + 1; j <= n; j++) {
			e[++k] = Edge{i, j, v[i] + v[j]};
		}
	}
	while (m--) {
		long long a, b, c;
		scanf("%lld%lld%lld", &a, &b, &c);
		e[++k] = Edge{a, b, c};
	}
	printf("%lld", kruscal());
    return 0;
}
2023/3/6 20:00
加载中...