WQS初学者疑问
查看原帖
WQS初学者疑问
629377
iamajcer楼主2025/1/21 14:04

为什么排序的时候,还要关于颜色排序?

下面是我的代码,只有加上 //*** 那句话才能AC。

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;

struct node
{
	int u, v, w, op;
}a[N];
int n, m, need, u1, v1, w1, op, f[N], ans=0;
int find(int x)
{
	if (x==f[x]) return x;
	return f[x]=find(f[x]);
}
bool cmp(node a, node b)
{
	if (a.w==b.w) return a.op<b.op;  //***
	return a.w<b.w;
}
bool check(int mid)
{
	int cnt=0, cnt0=0;
	
	for (int i=1; i<=m; i++)
		if (a[i].op==0) a[i].w-=mid;
	for (int i=0; i<n; i++) f[i]=i;
	ans=0;
	
	sort(a+1, a+1+m, cmp);
	for (int i=1; i<=m; i++)
	{
		int u=a[i].u, v=a[i].v, w=a[i].w, op=a[i].op;
		
		int fu=find(u), fv=find(v);
		if (f[fu]!=fv) f[fu]=fv, ans+=w, cnt++, cnt0+=(op==0);
		
		if (cnt==n-1) break;
	}
	
	for (int i=1; i<=m; i++)
		if (a[i].op==0) a[i].w+=mid;
	
	return (cnt0>=need);
}
int main()
{
	scanf("%d%d%d", &n, &m, &need);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d%d%d", &u1, &v1, &w1, &op);
		a[i]={u1, v1, w1, op};
	}
	
	int L=-100, R=100, res=0;
	while (L<=R)
	{
		int mid=L+R>>1;
		if (check(mid)) res=mid, R=mid-1;
		else L=mid+1;
	}
	check(res);
	printf("%d", ans+res*need);
	
	return 0;
}
2025/1/21 14:04
加载中...