P3623 86/72pts求条玄关
  • 板块学术版
  • 楼主mc2djwh
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/28 18:44
  • 上次更新2025/7/28 22:37:19
查看原帖
P3623 86/72pts求条玄关
1277996
mc2djwh楼主2025/7/28 18:44
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int fa[20010];
//先跑水泥路(1)
struct node {
	int x, y;
	bool rd;
};
bool cmp(node a, node b) {
	return a.rd > b.rd;
}
bool pmc(node a, node b) {
	return a.rd < b.rd;
}
int find(int x) {
	if (fa[x] == x) {
		return x;
	}
	return fa[x] = find(fa[x]);
}
void add(int x, int y) {
	x = find(x), y = find(y);
	if (x != y) {
		fa[x] = y;
	}
}
vector<node> edges;
vector<node> ans;
int main() {
	cin >> n >> m >> k;
	int cnt = 0;
	//输入
	for (int i = 1; i <= m; i++) {
		int u, v;
		bool c;
		cin >> u >> v >> c;
		if (!c) {
			cnt++;
		}
		edges.push_back({u, v, c});
	}
	if (cnt < k) {
		cout << "no solution";
		return 0;
	}
	//跑水泥路
	for (int i = 1; i <= n; i++) {
		fa[i] = i;
	}
	sort(edges.begin(), edges.end(), cmp);
	int i = 0;
	for (i = 0; i < edges.size(); i++) {
		if (!edges[i].rd) {
			break;
		}
		if (find(edges[i].x) != find(edges[i].y)) {
			add(edges[i].x, edges[i].y);
		}
	}
	cnt = 0;
	for (; i < edges.size(); i++) {
		if (find(edges[i].x) != find(edges[i].y)) {
			add(edges[i].x, edges[i].y);
			cnt++;
			ans.push_back({ edges[i].x, edges[i].y, edges[i].rd });
			edges.erase(edges.begin() + i);
			i--;
		}
	}
	if (cnt > k) {
		cout << "no solution";
		return 0;
	}
	//查联通
	for (i = 1; i < n; i++) {
		for (int j = i + 1; j <= n; j++) {
			if (find(i) != find(j)) {
				cout << "no solution";
				return 0;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		fa[i] = i;
	}
	for (auto x : ans) {
		add(x.x, x.y);
	}
	//加其他鹅卵石路
	sort(edges.begin(), edges.end(), pmc);
	i = 0;
	while (cnt < k) {
		if (find(edges[i].x) != find(edges[i].y)) {
			add(edges[i].x, edges[i].y);
			cnt++;
			ans.push_back({ edges[i].x, edges[i].y, edges[i].rd });
		}
		i++;
	}
	for (i = 0; i < edges.size(); i++) {
		if (edges[i].rd) {
			break;
		}
	}
	if (ans.size() != k) {
		cout << "no solution";
		return 0;
	}
	//加水泥路
	for (; i < edges.size(); i++) {
		if (find(edges[i].x) != find(edges[i].y)) {
			add(edges[i].x, edges[i].y);
			cnt++;
			ans.push_back({ edges[i].x, edges[i].y, edges[i].rd });
		}
	}
	//输出
	for (auto x : ans) {
		cout << x.x << " " << x.y << " " << x.rd << endl;
	}
	return 0;
}

86/72pts的原因是你古的评测机

2025/7/28 18:44
加载中...