社区讨论

萌新真的刚学OI,请教大佬一个弱智的question!!!

P2619[国家集训队] Tree I参与者 5已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mi7xfjpt
此快照首次捕获于
2025/11/21 05:11
4 个月前
此快照最后确认于
2025/11/21 05:11
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,need,ans,anss;
int fa[100005];
struct arr{
	int x,y,z,col;
}a[100005],b[100005];
int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
bool cmp(arr x,arr y)
{
	return x.z==y.z?x.col<y.col:x.z<y.z;
}
bool check(int x)
{
	int i;
	ans=-x*need;
	for (i=1;i<=n;i++)fa[i]=i;
	for (i=1;i<=m;i++)
	{
		b[i]=a[i];
		if (b[i].col==0)b[i].z+=x;
	}
	sort(b+1,b+m+1,cmp);
	int k=0,num=0;
	for (i=1;i<=m;i++)
	{
		int fx=getfa(b[i].x),fy=getfa(b[i].y);
		if (fx!=fy)
		{
	if(b[i].col==0&&num==need)continue;//为什么加了这句话就WA了,不是恰好need条吗???
			fa[fx]=fy;
			ans+=b[i].z;
			k++;
			if (b[i].col==0)num++;
			if (k==n-1)break;
		}
	}
	return num>=need;
}
int main()
{
	int i;
	scanf("%d%d%d",&n,&m,&need);
	for (i=1;i<=m;i++)scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].z,&a[i].col),a[i].x++,a[i].y++;
	int l=-105,r=105;
	while (l<=r)
	{
		int mid=(l+r)/2;
		if (check(mid))
		{
			l=mid+1;
			anss=ans;
		}else r=mid-1;
	}
	printf("%d",anss);
}
QAQ

回复

8 条回复,欢迎继续交流。

正在加载回复...