40分,求大佬调
查看原帖
40分,求大佬调
729457
ACehomoxue楼主2024/8/6 09:44
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define el cout<<'\n'
const int maxn=1e5+10;
int n,m,ans,father[maxn],tmp=0,need,ans2;
struct bian{
    int a,b,len,cd,col;
}pos[maxn];
bool cmp(bian a,bian b) {
	if(a.cd==b.cd) return a.col>b.col;
    return a.cd<b.cd;
}
int find(int cnt) {
    if(father[cnt]==cnt) return cnt;
    else {
        father[cnt]=find(father[cnt]);
        return father[cnt];
    } 
}
int check(int add) {
	int ret=0;ans=0,tmp=0;
	for(int i=1;i<=m;i++) {
		if(pos[i].col==0) pos[i].cd=pos[i].len+add;
		else pos[i].cd=pos[i].len;
	}
	for(int i=1;i<=n;i++) father[i]=i;
    sort(pos+1,pos+m+1,cmp);
    for(int i=1;i<=m;i++) {
        if(find(pos[i].a)!=find(pos[i].b)) {
            tmp++;
            ans+=pos[i].len;
            father[find(pos[i].a)]=father[find(pos[i].b)];
            if(pos[i].col==0) ret++;
            if(tmp==n-1) break;
        }
    }
    return ret;
}
signed main() {
    cin>>n>>m>>need;
    for(int i=1;i<=m;i++) {
		cin>>pos[i].a>>pos[i].b>>pos[i].len>>pos[i].col;
		pos[i].a++,pos[i].b++;
	}
    int l=-114,r=114,mid=1919810;
    while(l<=r) {
    	mid=l+(r-l)/2;
    	if(check(mid)<need) r=mid-1;
    	else {
    		ans2=ans;
    		l=mid+1;
    	}
	}
    cout<<ans2;el;
    return 0;
}
2024/8/6 09:44
加载中...