题解占坑
#include<bits/stdc++.h>
#define sc scanf
using namespace std;
typedef long long ll;
const int maxn = 1e6+9;
struct node{
int u,v,w,c;
inline bool operator < (const node&x){
return w<x.w;
}
inline void input(){
scanf("%d%d%d%d",&u,&v,&w,&c);
}
}E[maxn];
int fa[maxn],n,m,k,mw,ans;
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
inline int try_add(node x){
if(find(x.u)==find(x.v))return 0;
fa[fa[x.u]]=fa[x.v];return 1;
}
int main(){
sc("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++){
E[i].input();
if(!E[i].c)swap(E[mw++],E[i]);
}
sort(E,E+mw);sort(E+mw,E+m);
int l=-100,r=100,md,tmp,i,j;
while(l<r){
md=(l+r+1)>>1;
for(int i=0;i<n;i++)fa[i]=i;
tmp=i=0,j=mw;
while(i<mw&&j<m){
E[i].w+md<=E[j].w?tmp+=try_add(E[i++]):try_add(E[j++]);
}
while(i<mw)tmp+=try_add(E[i++]);
tmp<k?r=md-1:l=md;
//cout<<tmp<<endl;
}
md=l;
for(int i=0;i<n;i++)fa[i]=i;
ans=tmp=i=0,j=mw;
while(i<mw&&j<m){
E[i].w+md<=E[j].w?ans+=try_add(E[i])*(E[i++].w+md):ans+=try_add(E[j])*E[j++].w;
}
while(i<mw)ans+=try_add(E[i])*(E[i++].w+md);
while(j<m)ans+=try_add(E[j])*E[j++].w;
printf("%d\n",ans-k*md);
}