蒟蒻交了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;
}