WA 了12和14点,实在找不出错误。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct hhh{
int s,t,c,col;
}dl[1000010];
ll V,E,need,f[1000010],ans,sum,tot,fina;
bool cmp(hhh x,hhh y){
if(x.c==y.c) return x.s<y.s;
return x.c<y.c;
}
int find(int x){
if(f[x]!=x) return f[x]=find(f[x]);
return x;
}
void kruskal(){
sort(dl+1,dl+E+1,cmp);
for(int i=1;sum<V-1;i++){
int x=find(dl[i].s),y=find(dl[i].t);
if(x==y) continue;
sum++;
f[y]=x;
if(dl[i].col==0) tot++;
ans+=dl[i].c;
}
}
int main(){
cin>>V>>E>>need;
int s,t,c,col;
for(int i=1;i<=E;i++){
cin>>dl[i].s>>dl[i].t>>dl[i].c>>dl[i].col;
dl[i].s++,dl[i].t++;
}
int l=-211,r=211;
while(l<=r){
int mid=(l+r)/2;
for(int i=1;i<=E;i++) if(dl[i].col==0) dl[i].c+=mid;
for(int i=1;i<=V+1;i++) f[i]=i;
ans=0,sum=0,tot=0;
kruskal();
if(tot>=need){
l=mid+1;
fina=ans-mid*need;
}
else r=mid-1;
for(int i=1;i<=E;i++) if(dl[i].col==0) dl[i].c-=mid;
}
cout<<fina;
return 0;
}