15分求助
查看原帖
15分求助
551803
BPG_ning楼主2022/8/13 15:30
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m,nd,l=-101,r=101,ans,sum,cnt,out,fa[maxn];
struct node{int x,y,w,col;};
node a[maxn],tmp[maxn];
bool cmp(node a,node b){return a.w==b.w?a.col<b.col:a.w<b.w;}
int find_set(int x){return x==fa[x]?x:fa[x]=find_set(fa[x]);}
bool check(int k){
	ans=0,sum=0,cnt=0;
	for(int i=1;i<=m;i++) tmp[i]=a[i];
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) if(!tmp[i].col) tmp[i].w+=k;
	sort(tmp+1,tmp+1+m,cmp);
	for(int i=1;i<=m;i++){
		int x=tmp[i].x,y=tmp[i].y;
		int u=find_set(x),v=find_set(y);
		if(u==v)continue;
		fa[v]=u;
		cnt++;
		if(!tmp[i].col) sum++;
		ans+=tmp[i].w;
		if(cnt==n-1) break;
	}
	return sum>=nd;
}
signed main(){
	ios::sync_with_stdio(false);
	std::cin.tie(0);std::cout.tie(0);
	cin>>n>>m>>nd;
	for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y>>a[i].w>>a[i].col;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid)) l=mid+1,out=ans-nd*mid;
		else r=mid;
	}
	cout<<out<<endl;
	return 0;
}
2022/8/13 15:30
加载中...