15pts求调
查看原帖
15pts求调
755363
IT_theory楼主2025/2/6 14:23
#include<bits/stdc++.h>
using namespace std;
template<size_t LEN>
struct disjointSetUnion{
    int fa[LEN],sz[LEN];
    disjointSetUnion(){for(int i = 0;i<LEN;i++)fa[i]=i,sz[i]=1;}
    int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    void merge(int x,int y){
        x = find(x),y = find(y);
        if(sz[x]>sz[y])swap(x,y);
        fa[x]=y,sz[y]+=sz[x];
    }
};disjointSetUnion<30000>f1,f2;
struct edge{int x,y,w;}e[100100];
vector<edge>good,bad,ans;
int n,m,k;
int main(){
    #ifndef ONLINE_JUDGE
    freopen("T4.in","r",stdin);
    freopen("T4.out","w",stdout);
    #endif
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
	for(int i = 1;i<=m;i++)if(e[i].w==0)f1.merge(e[i].x,e[i].y);
	for(int i = 1;i<=m;i++)if(e[i].w==1){
		if(f1.find(e[i].x)==f1.find(e[i].y))bad.push_back(e[i]);
		else good.push_back(e[i]);
	}int cnt = 0;
	for(edge o: good){
		if(cnt==k)break;
		if(f1.find(o.x)==f1.find(o.y))continue;
		f1.merge(o.x,o.y);f2.merge(o.x,o.y);
		ans.push_back(o);
		cnt++;
	}
	for(int i = 1;i<=m;i++){
		if(e[i].w==0)continue;
		if(cnt==k)break;
		if(f2.find(e[i].x)==f2.find(e[i].y))continue;
		f2.merge(e[i].x,e[i].y);ans.push_back(e[i]);
		cnt++;
	}
	if(cnt!=k){puts("no solution\n");return 0;}
	for(int i = 1;i<=m;i++){
		if(e[i].w!=0)continue;
		if(f2.find(e[i].x)==f2.find(e[i].y))continue;
		ans.push_back(e[i]);f2.merge(e[i].x,e[i].y);
	}
	if(ans.size()<n-1){puts("no solution\n");return 0;}
	for(edge o: ans)printf("%d %d %d\n",o.x,o.y,o.w);
    return 0;
}

七个点对一个,我是个蒟蒻,请求大佬调

2025/2/6 14:23
加载中...