#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+7,M = 2e5+7;
typedef long long ll;
struct E{
int from,to,w,col;
bool operator < (const E &b) const{
if(w==b.w) return col < b.col;//这是一个坑点,排序的时候如果值相等,要优先考虑白的
return w < b.w;
}
}e[M];
int zong,n,m,need;
int pre[N];
ll ans,res;
void read(){
scanf("%d%d%d",&n,&m,&need);
for(int i=1;i <= m;i++){
scanf("%d%d%d%d",&e[i].from,&e[i].to,&e[i].w,&e[i].col);
}
}
int find(int x){
return x == pre[x] ? x : pre[x] = find(pre[x]);
}
void kuskr(int mid){
for(int i=0;i<=n;i++)
pre[i] = i;
ans = zong = 0;
for(int i=1;i<=m;i++)
if(!e[i].col) e[i].w += mid;
sort(e+1,e+m+1);
for(int i=1;i <= m;i++){
int fx = find(e[i].from);
int fy = find(e[i].to);
if(fx != fy){
pre[fx] = fy;
ans += e[i].w;
if(!e[i].col) zong ++;
}
}
for(int i=1;i<=m;i++)
if(!e[i].col) e[i].w -= mid;
}
void solve(){
int l =-100,r=100;
while(l <= r){
int mid = (l+r)>>1;
kuskr(mid);
if(zong >= need) l=mid+1,res = ans - need*mid;//这个点我有点不明白,为什么是need而不是zong,比较是树上的,即使最后保证有结果。
else r = mid-1;
}
printf("%lld\n",res);
}
int main(){
read();
solve();
return 0;
}
一本通1491:Tree
最新推荐文章于 2025-07-31 22:28:05 发布