代码求调
查看原帖
代码求调
326254
LonginusMonkey楼主2023/8/25 17:28

思路:kruskal3遍

样例:AC

结果:15pt

#include<bits/stdc++.h>
#define int long long
using namespace std;
int father[20100];
int fa[20010];
struct node{
	int u, v, w, is;
}edge[100010];
int find(int index) {
	if(father[index] == index) return index;
	return father[index] = find(father[index]);
}
int find2(int index) {
	if(fa[index] == index) return index;
	return fa[index] = find(fa[index]);
}
int cnt = 0;
bool cmp(node x, node y) {
	return x.w > y.w;
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0);
	int n, m, k; cin >> n >> m >> k;
	for(int i=1; i<=m; ++i) cin >> edge[i].u >> edge[i].v >> edge[i].w;
	for(int i=1; i<=n; ++i) {
		fa[i] = i;
	}
	for(int i=1; i<=n; ++i) {
		father[i] = i;
	}
	cnt = 0;
	int cnt2 = 0;
	for(int i=1; i<=m; ++i) {
		if(edge[i].w == 0) {
			if(find(edge[i].u) != find(edge[i].v)) {
				father[find(edge[i].u)] = find(edge[i].v);
			}
		}
	}
	for(int i=1; i<=m; ++i) {
		if(edge[i].w == 1) {
			if(find(edge[i].u) != find(edge[i].v)) {
				edge[i].is = 1;
				father[find(edge[i].u)] = find(edge[i].v);
				fa[find2(edge[i].u)] = find2(edge[i].v);
				cnt ++;
			}
		}
	}
	cnt2 = cnt;
	if(cnt > k) {
		cout << "no solution";
		return 0;
	}
	for(int i=1; i<=n; ++i) {
		father[i] = i;
	}
	cnt = 0;
	for(int i=1; i<=m; ++i) {
		if(edge[i].w == 1) {
			if(find(edge[i].u) != find(edge[i].v)) {
				father[find(edge[i].u)] = find(edge[i].v);
			}
		}
	}
	for(int i=1; i<=m; ++i) {
		if(edge[i].w == 0) {
			if(find(edge[i].u) != find(edge[i].v)) {
				edge[i].is = 1;
				father[find(edge[i].u)] = find(edge[i].v);
				fa[find2(edge[i].u)] = find2(edge[i].v);
				cnt ++;
			}
		}
	}
	if(cnt > n-k-1) {
		cout << "no solution";
		return 0;
	}
	sort(edge+1, edge+1+m, cmp);
	int ct = cnt + cnt2;
	for(int i=1; i<=m; ++i) {
		if(ct == n-1) {
			if(cnt2 < k) {
				cout << "no solution";
				return 0;
			}
			break;
		}
		if(find2(edge[i].u) != find2(edge[i].v) && !edge[i].is) {
			if(edge[i].w && cnt2 < k) {
				fa[find2(edge[i].u)] = find2(edge[i].v);
				cnt2++;
				edge[i].is = 1;
				ct++;
			}
			if(!edge[i].w && ct - cnt2 <  n-k-1) {
				fa[find2(edge[i].u)] = find2(edge[i].v);
				ct++;
				edge[i].is = 1;
			}
		}
	}
	if(ct < n-1  ||  cnt2 != k) {
		cout << "no solution";
		return 0;
	}
	for(int i=1; i<=m; ++i) {
		if(edge[i].is) {
			cout << edge[i].u << " " << edge[i].v << " " << edge[i].w << endl;
		}
	}
	return 0;
}
2023/8/25 17:28
加载中...