boruvka20pt
查看原帖
boruvka20pt
667180
Assassin_HG楼主2024/3/20 11:19
#include<bits/stdc++.h>
#define re register
const int maxn = 1e5 + 10, maxm = 2e5 + 10;
using namespace std;
int n, k, m, ans[maxm], f[maxn], maxx = INT_MIN, best[maxn], cnt;
bool vis[maxm];
struct nd {
	int a, b, c1, c2;
} e[maxm];
int find(int u) {
	return u == f[u] ? u : find(f[u]);
}
void hb(int u, int v) {
	f[find(u)] = find(v);
}
bool btr(int u, int v) {
	if (v == 0) return 1;
	if (cnt < k) {
		if (e[u].c1 != e[v].c1)
			return e[u].c1 <= e[v].c1;
	}
	return e[u].c2 <= e[v].c2;
	if (e[u].c2 != e[v].c2) {
		return u < v;
	}
}
void boruvka() {
	bool status = true;
	while (status) {
		status = false;
		memset(best, 0, sizeof best);
		for (re int i = 1; i <= m; ++i) {
			if (!vis[i]) {
				int uu = find(e[i].a), vv = find(e[i].b);
				if (uu == vv) {
					continue;
				}
				if (btr(i, best[uu])) {
					best[uu] = i;
				}
				if (btr(i, best[vv])) {
					best[vv] = i;
				}
			}
		}
		for (re int i = 1; i <= n; ++i) {
			if (best[i] && !vis[best[i]]) {
				status = true;
				cnt++;
				vis[best[i]] = 1;
				hb(e[best[i]].a, e[best[i]].b);
				if (cnt <= k) {
					maxx = max(maxx, e[best[i]].c1);
					ans[best[i]] = 1;
				} else {
					maxx = max(maxx, e[best[i]].c2);
					ans[best[i]] = 2;
				}
			}
		}
	}
}
int main() {
	scanf("%d%d%d", &n, &k, &m);
	for (re int i = 1; i <= m - 1; ++i) {
		scanf("%d%d%d%d", &e[i].a, &e[i].b, &e[i].c1, &e[i].c2);
	}
	for (re int i = 1; i <= n; ++i) {
		f[i] = i;
	}
	boruvka();
	printf("%d\n", maxx);
	for (int i = 1; i <= m; ++i) {
		if (ans[i] == 0) {
			continue;
		}
		printf("%d %d\n", i, ans[i]);
	}
	return 0;
}
2024/3/20 11:19
加载中...