萌新初学OI,样例未过求调
查看原帖
萌新初学OI,样例未过求调
448884
快乐的大童楼主2022/7/11 18:59

RT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#define x1 xx1
#define y1 yy1
using namespace std;
inline int R(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);
}
inline void writesp(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(32);
}
inline void writeln(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(10);
}
inline char read(){
	char ch=getchar();
	while(1) ch=getchar();
	return ch;
}
const int N=5e4+5,M=1e5+5;
struct node{
	int u,v,w,col;
}a[M];
struct edge{
	int u,v,w,col;
}e[M];
int n,m,need,ans;
int f[N];
int getf(int x){
	return f[x]==x?x:f[x]=getf(f[x]);
}
bool cmp(edge x,edge y){
	if(x.w==y.w) return x.col<y.col;
	else return x.w<y.w;
}
int cnt;//白边个数
int sum;//树权值和
int ccnt; 
void kruscal(){
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++){
		int g1=getf(e[i].u),g2=getf(e[i].v);
		if(g1!=g2){
			f[g1]=g2;
			if(!e[i].col) ccnt++;
			sum+=e[i].w;
			ccnt++;
			if(ccnt==n-1) return;
		}
	}
}
void binary_search(int l,int r){
	while(l<=r){
		int mid=l+r>>1;
		for(int i=1;i<=m;i++)
			e[i]=(edge){a[i].u,a[i].v,a[i].col?a[i].w:a[i].w+mid,a[i].col};
		for(int i=1;i<=n;i++) 
			f[i]=i;		
		cnt=ccnt=sum=0;
		kruscal();
		if(cnt>=need) l=mid+1,ans=sum-need*mid;
		else r=mid-1; 
	}
}
int main(){
	n=R(),m=R(),need=R();
	for(int i=1,x,y,z,col;i<=m;i++){
		x=R()+1,y=R()+1,z=R(),col=R();
		a[i]=(node){x,y,z,col};
	}
	binary_search(-100,100);
	write(ans);
}

2022/7/11 18:59
加载中...