20分,不是说任意吗?
查看原帖
20分,不是说任意吗?
742030
hyh0926楼主2024/4/20 17:58

不是说任意一种方案吗?

#include<bits/stdc++.h>
using namespace std;
int n,k,m,fa[10001],ii,ans;
struct node
{
	int u,v,w1,w2,ij;
}e[20002];
struct node2
{
	int u,v;
}i1[20002];
bool cmp1(node x,node y)
{
	return x.w1<y.w1;
}
int find(int l)
{
	if(fa[l]==l)
	{
		return l;
	}
	else
	{
		fa[l]=find(fa[l]);
		return fa[l];
	}
}
void kls1()
{
	for(int i=1;i<m&&k!=0;i++)
	{
		if(find(e[i].u)!=find(e[i].v))
		{
			fa[fa[e[i].u]]=fa[e[i].v];
			i1[++ii].u=e[i].ij;
			i1[ii].v=1;
			ans=max(ans,e[i].w1);
			k--;
		}
	}
}
bool cmp2(node x,node y)
{
	return x.w2<y.w2;
}
void kls2()
{
	for(int i=1;i<m;i++)
	{
		if(find(e[i].u)!=find(e[i].v))
		{
			fa[fa[e[i].u]]=fa[e[i].v];
			i1[++ii].u=e[i].ij;
			i1[ii].v=2;
		}
	}
}
bool cmp3(node2 x,node2 y)
{
	return x.u<y.u;
}
int main()
{
	cin>>n>>k>>m;
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	for(int i=1;i<m;i++)
	{
		int x,y,z1,z2;
		cin>>x>>y>>z1>>z2;
		e[i].u=x;
		e[i].v=y;
		e[i].w1=z1;
		e[i].w2=z2;
		e[i].ij=i;
	}
	sort(e+1,e+m,cmp1);
	kls1();
	sort(e+1,e+m,cmp2);
	kls2();
	sort(i1+1,i1+ii,cmp3);
	cout<<ans<<endl;
	for(int i=1;i<=ii;i++)
	{
		cout<<i1[i].u<<" "<<i1[i].v<<endl;
	}
	return 0;
}
2024/4/20 17:58
加载中...