求求求29pts
查看原帖
求求求29pts
510311
Yuzzzu楼主2024/9/13 11:50

蒟蒻交了20多次就不知道错在哪

马蜂致歉

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,fa[2000010],cnt,tot;
struct node{
	int u,v,c,flag;	
}e[2000010],ans[2000010];
int cmp(node a,node b){
	return a.c<b.c;
}
int find(int x){
	return fa[x]==x?x:(fa[x]=find(fa[x]));
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=1;i<=m;i++) {
		scanf("%lld%lld%lld",&e[i].u,&e[i].v,&e[i].c);
		e[i].flag=0;
	}
	int k1=k;
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int xx=find(e[i].u),yy=find(e[i].v);
		if(xx!=yy){
			if(e[i].c==1) {//必需1边 
				e[i].flag=1;
				k--;
			}
			fa[xx]=yy;
		}
	}
	if(k<0) {
		printf("no solution");
		return 0;
	}
	for(int i=1;i<=n;i++){//不连通 
		if(find(fa[i])!=find(fa[1])){
			printf("no solution");
			return 0;
		}
	}
	//for(int i=1;i<=n;i++) printf("%d\n",find1(fa[i]));
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=m;i>=1;i--)
	{
		int xx=find(e[i].u),yy=find(e[i].v);
		if(e[i].flag) {
			fa[xx]=yy;
			ans[++cnt]=e[i];
		}
	}
	if(k>0){//补充1边至k条 
		for(int i=m;i>=1;i--){
			if(e[i].flag) continue;
			if(e[i].c==0) break;
			if(k==0) break;
			int xx=find(e[i].u),yy=find(e[i].v);
			if(xx!=yy){
				k--;
				ans[++cnt]=e[i];
				fa[xx]=yy;
			}
		}
		if(k>0){//1边少于k条 
			printf("no solution");
			return 0;
		}
	}
	int res=0;
	for(int i=1;i<=m;i++){
		int xx=find(e[i].u),yy=find(e[i].v);
		if(xx!=yy && !e[i].c){//补充0边 
			ans[++cnt]=e[i];
			fa[xx]=yy;
			res++;
		}
	}
	if(res!=n-k1-1){
		printf("no solution");
		return 0;
	}
	for(int i=1;i<=cnt;i++){
		printf("%lld %lld %lld\n",ans[i].u,ans[i].v,ans[i].c);
	}
	return 0;
} 
2024/9/13 11:50
加载中...