KruskalWA一个点求助
查看原帖
KruskalWA一个点求助
169606
Jason12楼主2022/7/6 15:46

按照第一篇题解的思路写的

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

2022/7/6 15:46
加载中...