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;
}