RT,WA #8 #13 #17 #19
#include<bits/stdc++.h>
using namespace std;
int n,m,t,tt,ttt,need;
int l,r,mid;
int ecnt,sum,white;
struct edge
{
int u;
int v;
int w;
int c;
}e[100001];
bool cmp(edge a,edge b)
{
return (a.w<b.w) || (a.w==b.w && a.c<b.c);
}
int f[50001];
int find(int x){if(f[x]==x) return x;else return f[x]=find(f[x]);}
void kruskal()
{
for(int i=1;i<=n;i++) f[i]=i;
sort(e+1,e+m+1,cmp);
ecnt=sum=white=0;
for(int i=1;i<=m;i++)
{
t=find(e[i].u),tt=find(e[i].v);
if(t==tt) continue;
f[t]=tt,ecnt++,white+=1-e[i].c,sum+=e[i].w;
if(ecnt==n-1) break;
}
//cout<<mid<<": ";for(int i=1;i<=m;i++) cout<<e[i].w<<" ";cout<<endl;
//cout<<sum<<" "<<white<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m>>need;
for(int i=1;i<=m;i++)
{
cin>>e[i].u>>e[i].v>>e[i].w>>e[i].c;
e[i].u++,e[i].v++;
}
l=-114,r=114;//这数好,就它了
while(l<r)
{
mid=(l+r)>>1;
for(int i=1;i<=m;i++) if(!e[i].c) e[i].w+=mid;
kruskal();
if(white>=need) l=mid+1,ttt=sum-need*mid;
else r=mid-1;
for(int i=1;i<=m;i++) if(!e[i].c) e[i].w-=mid;
}
cout<<ttt;
return 0;
}