为什么排序的时候,还要关于颜色排序?
下面是我的代码,只有加上 //***
那句话才能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;
}