玄关求调
查看原帖
玄关求调
1400210
ty22caolongjun楼主2024/8/2 19:54

WA了1,2,3,4,6

T了5

A了7

不知为何最后的输出改为 tot ~ 1 后第六个点会过

#include<bits/stdc++.h>
using namespace std;
struct nod{
	int u,v,w;
}z[100005];
int f[20005];
int n,m,k;
int find(int x){
	if(f[x]!=x) return find(f[x]);
	return x;
}
bool cmp1(nod a,nod b){
	return a.w<b.w;
}
int num=0;
void kruskal1(){
	int tot=0;
	for(int i=1;i<=n;i++) f[i]=i;
	sort(z+1,z+m+1,cmp1);
	for(int i=1;i<=m;i++){
		int a=find(z[i].u),b=find(z[i].v);
		if(a!=b){
			f[a]=b;
			tot++;
			num+=z[i].w;
			if(z[i].w) z[i].w=2;
		}
		if(tot==n-1) return;
	}
}
bool cmp2(nod a,nod b){
	return a.w>b.w;
}
int ans[100005];
int sum=0;
int tot=0;
void kruskal2(){
	for(int i=1;i<=n;i++) f[i]=i;
	sort(z+1,z+m+1,cmp2);
	for(int i=1;i<=m;i++){
		int a=find(z[i].u),b=find(z[i].v);
		if(z[i].w){
			if(sum==k) continue;
			if(a!=b){
				ans[++tot]=i;
				sum++;
			}
		}
		else{
			if(sum==k) ans[++tot]=i;
			if(sum<k){
				tot=0;
				return;
			}
		}
		if(tot==n-1) return;
	}
	tot=0;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&z[i].u,&z[i].v,&z[i].w);
		z[i].w=!z[i].w;
	}
	kruskal1();
	if(num>k){
		printf("no solution");
		return 0;
	}
	kruskal2();
	if(tot)
		for(int i=1;i<=tot;i++) printf("%d %d %d\n",z[ans[i]].u,z[ans[i]].v,!z[ans[i]].w);
	else printf("no solution");
	return 0;
}
2024/8/2 19:54
加载中...