#include<bits/stdc++.h>
#define maxn 50005
#define maxm 100005
using namespace std;
struct node{
int u,v,w,c;
};
int n,m,k,ans,ans1,fa[maxn];
node a[maxm*2],b[maxm*2];
bool cmp(node x,node y){
if(x.w==y.w) return x.c<y.c;
return x.w<y.w;
}
int find(int x){
if(fa[x]==x)return x;
fa[x]=find(fa[x]);
return fa[x];
}
void merge(int x,int y){
int a1=find(x),b1=find(y);
fa[b1]=a1;
return ;
}
int work(){
//cout<<"dfsa"<<endl;
//for(int i=1;i<=m;i++)cout<<i<<" "<<b[i].w<<endl;
for(int i=0;i<=n;i++)fa[i]=i;
sort(b+1,b+m+1,cmp);
//for(int i=1;i<=m;i++)cout<<i<<" "<<b[i].w<<endl;
//cout<<endl;
int k1=1,s=0;
ans=0;
for(int i=1;i<n;i++){
//cout<<i<<endl;
while(find(b[k1].u)==find(b[k1].v))k1++;
//cout<<k1<<endl;
ans+=b[k1].w;
//cout<<b[k].c<<" ";
if(b[k1].c==0)s++;
//cout<<s<<endl;
merge(b[k1].u,b[k1].v);
}
//cout<<s<<endl;
//cout<<endl;
return s;
}
int main(){
//freopen("temp.in","r",stdin);
scanf("%d %d %d",&n,&m,&k);
//cout<<n<<" "<<m<<" "<<k<<endl;
for(int i=1;i<=m;i++){
scanf("%d %d %d %d",&a[i].u,&a[i].v,&a[i].w,&a[i].c);
}
int left=-100,right=100,mid;
while(left<=right){
mid=(left+right)/2;
//cout<<mid<<endl;
for(int i=1;i<=m;i++){
b[i].u=a[i].u;b[i].v=a[i].v;b[i].w=a[i].w;b[i].c=a[i].c;
if(a[i].c==0)b[i].w=b[i].w+mid;
//cout<<i<<" "<<b[i].w<<endl;
}
int h=work();
//cout<<h<<endl;
if(h>=k){
ans1=ans-mid*k; left=mid+1;
}
else right=mid-1;
}
printf("%d\n",ans1);
return 0;
}
luogu2619/bzoj2654
猜你喜欢
转载自blog.csdn.net/weixin_43342048/article/details/82961014
今日推荐
周排行