用的wqs二分,为啥错了.
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,a,b) for(int i=(a);i<=(b);i++)
const int Maxn=2e5+5;
int sum,cnt,now,Ans;
int v,e,need,f[Maxn];
struct node {
int s,t,c,col;
} a[Maxn];
inline int find(int x) {
if(x==f[x]) return x;
else return f[x]=find(f[x]);
}
bool cmp(node a,node b) {
return a.c<b.c;
}
inline void check() {
sort(a+1,a+e+1,cmp);
for(int i=1; cnt!=v-1; i++) {
int x=find(a[i].s),y=find(a[i].t);
if(x==y) continue;
cnt++;
f[x]=y;
if(a[i].col==0) now++;
sum+=a[i].c;
}
}
signed main() {
cin>>v>>e>>need;
F(i,1,e) {
cin>>a[i].s>>a[i].t>>a[i].c>>a[i].col;
a[i].s++;
a[i].t++;
}
int l=-114,r=514;
while(l<=r) {
int mid = l + r >> 1;
F(i,1,v+1) f[i]=i;
F(i,1,e) {
if(a[i].col==0) a[i].c+=mid;
}
now=sum=cnt=0;
check();
if(now>=need) l=mid+1,Ans=sum-mid*need;
else r=mid-1;
F(i,1,e) {
if(a[i].col==0) a[i].c-=mid;
}
}
cout<<Ans;
return 0;
}