luogu2619/bzoj2654

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43342048/article/details/82961014