按照第一篇题解的思路写的
#include <bits/stdc++.h>
using namespace std;
int n,m,l,t,ans,u,v,b[20005],c[20005],i;
struct xy{
int x,y,z;
}a[100005],s[100005];
bool cmp1(xy u,xy v)
{
return u.z>v.z;
}
bool cmp2(xy u,xy v)
{
return u.z<v.z;
}
void init()
{
t=0;
ans=0;
for (i=1;i<=n;i++)
{
b[i]=i;
c[i]=1;
}
}
int fd(int t)
{
if (b[t]!=t) b[t]=fd(b[t]);
return b[t];
}
bool ms(int u,int v)
{
if (u==v) return 0;
if (c[u]>c[v]) b[v]=b[u];
else
{
b[u]=b[v];
if (c[u]==c[v]) c[v]++;
}
return 1;
}
bool check()
{
int k,u;
u=fd(1);
for (k=2;k<=n;k++)
{
if (fd(k)!=u) return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(nullptr);
init();
cin>>n>>m>>l;
for (i=1;i<=m;i++)
{
cin>>a[i].x>>a[i].y>>a[i].z;
}
sort(a+1,a+m+1,cmp1);
for (i=1;i<=m;i++)
{
u=fd(a[i].x);
v=fd(a[i].y);
if (ms(u,v) && a[i].z==0)
{
t++;
a[i].z=-1;
}
}
if (t>l || check())
{
cout<<"no solution\n";
return 0;
}
init();
sort(a+1,a+m+1,cmp2);
for (i=1;i<=m;i++)
{
u=fd(a[i].x);
v=fd(a[i].y);
if (u!=v && (a[i].z==1 || t<l))
{
ms(u,v);
if (a[i].z<1)
{
t++;
a[i].z=0;
}
s[++ans]=a[i];
}
}
if (t<l || check())
{
cout<<"no solution\n";
return 0;
}
for (i=1;i<=ans;i++)
{
cout<<s[i].x<<" "<<s[i].y<<" "<<s[i].z<<endl;
}
return 0;
}