不知道怎么wa了
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e6;
struct Edges{
int u,v,val,com;
bool operator <(const Edges & a)const{
if(val!=a.val)
return val<a.val;
else return com<a.com;
}
}edges[N];
int p[N],n,m,k;
void init(){
for(int i=0;i<=n;i++){
p[i]=i;
}
}
int find(int x){
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
int ans=0;
bool check(int mid){
init();
for(int i=1;i<=m;i++){
if(edges[i].com==0){
edges[i].val+=mid;
}
}
sort(edges+1,edges+1+m);
int cnt=0;
ans=0;
for(int i=1;i<=m;i++){
int u=find(edges[i].u),v=find(edges[i].v);
if(edges[i].com==0){
edges[i].val-=mid;
}
if(u!=v){
ans+=edges[i].val;
p[u]=v;
if(edges[i].com==0){
cnt++;
}
}
}
return cnt>=k;
}
int main(){
int Tcnt=0;
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i=1;i<=m;i++){
int u,v,w,com;
scanf("%d%d%d%d",&u,&v,&w,&com);
edges[i]={u,v,w,com};
}
int l=-100,r=100;
while(l<=r){
int mid=(l+r)/2;
if(check(mid))l=mid+1;
else r=mid-1;
}
printf("Case %d: %d\n",++Tcnt,ans);
}
return 0;
}