35pts 求调
查看原帖
35pts 求调
548300
a1111111111111楼主2024/7/6 15:10

rt.

#include<bits/stdc++.h>
using namespace std;
int n,m,fa[200005],need;
struct edge{
	int u,v,w,id;
	friend bool operator < (edge a,edge b){
		return a.w<b.w;
	}
};
edge e[200005],mst[200005];
int Find(int x){
	if(fa[x]!=x) return fa[x] = Find(fa[x]);
	else return fa[x];
}
void Union(int u,int v){
	int fu = Find(u);
	int fv = Find(v);
	if(fu!=fv) fa[fv] = fu;
}
pair<int,int> check(int Snoozing_QwQ){
	for(int i = 1;i<=m;i++) e[i].w+=(1-e[i].id)*Snoozing_QwQ;
	for(int i = 1;i<=n;i++) fa[i] = i;
	sort(e+1,e+1+m);
	for(int i = 1;i<=m;i++) e[i].w-=(1-e[i].id)*Snoozing_QwQ;
    int ans = n-1,QwQ = 0;
	for(int i = 1;i<=m;i++)
		if(Find(e[i].u)!=Find(e[i].v)){
            QwQ+=e[i].w;
            ans-=e[i].id;
			Union(e[i].u,e[i].v);
		}
    return pair<int,int>{ans,QwQ};
}
int main(){
	cin >> n >> m >> need;
	for(int i = 1;i<=m;i++) cin >> e[i].u >> e[i].v >> e[i].w >> e[i].id,e[i].u++,e[i].v++;
    int l = -105,r = 105,mid,ans = 1145141919;
    while(l<=r){
        mid = (l+r)>>1;
        pair<int,int> p = check(mid);
        if(p.first<need) r = mid-1;
        else if(p.first==need){
            r = mid-1,ans = min(ans,p.second);
        }else l = mid+1;
    }
    cout << ans;
	return 0;
}
2024/7/6 15:10
加载中...