求助,只能过一般的测试集,后面的都大了一点
查看原帖
求助,只能过一般的测试集,后面的都大了一点
1104955
nouers楼主2024/3/2 16:07

求助,找了好久也不知道哪错了,也没用测试集

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

struct A {
	int next, to, w1, w2, num;
} p[20010];

struct B {
	int p, t;
} q[10010];
int book[10010];
int minn;
int fa[10010];
int n, m, k;
int tmp = 1;

bool cmp1(A a, A b) {
	return a.w1 < b.w1;
}

bool cmp2(A a, A b) {
	return a.w2 < b.w2;
}

bool cmp3(B a, B b) {
	return a.t < b.t;
}

int find(int x) {
	if (fa[x] == x)
		return x;
	else {
		fa[x] = find(fa[x]);
		return fa[x];
	}
}

void kruskal1() {

	int step = 0;
	for (int i = 1; i < m; i++) {
		if (!book[p[i].num]) {

			if (find(p[i].next) != find(p[i].to)) {
				fa[find(p[i].next)] = fa[find(p[i].to)];
				q[tmp].t = p[i].num;
				q[tmp].p = 1;
				step++;
				tmp++;
				minn = max(minn, p[i].w1);
				book[p[i].num] = 1;
			}

		}
		if (step == k)
			return;
	}
}

void kruskal2() {

	int step = 0;
	for (int i = 1; i < m; i++) {
		if (!book[p[i].num]) {

			if (find(p[i].next) != find(p[i].to)) {
				fa[find(p[i].next)] = fa[find(p[i].to)];
				book[p[i].num] = 1;
				q[tmp].t = p[i].num;
				q[tmp].p = 2;
				step++;
				tmp++;
				minn = max(minn, p[i].w2);
			}

		}
		if (step == n - 1 - k)
			return;
	}
}

int main () {
	cin >> n >> k >> m;
	for (int i = 1; i < m; i++) {
		cin >> p[i].next >> p[i].to >> p[i].w1 >> p[i].w2;
		p[i].num = i;
	}
	memset(book, 0, sizeof(book));
	for (int i = 1; i <= n; i++) {
		fa[i] = i;
	}
	sort(p + 1, p + m, cmp1);
	kruskal1();
	sort(p + 1, p + m, cmp2);
	kruskal2();
	sort(q + 1, q + n, cmp3);

	cout << minn << endl;
	for (int i = 1; i < n; i++) {
		cout << q[i].t << " " << q[i].p << endl;
	}

}```
2024/3/2 16:07
加载中...