二分+MST WA 20pts
查看原帖
二分+MST WA 20pts
432183
JoeBiden2020楼主2021/12/12 14:34
#include<bits/stdc++.h>
using namespace std;
int n,m,ju[501],fa[1001],maxn=-1,minn=9999,x[1001],y[1001],cnt;
struct edge{
	int from,to;
	double val;
}e[1000001];
double dis(int p1,int p2){
	return sqrt(pow(x[p1]-x[p2],2)+pow(y[p1]-y[p2],2));//求距离 
}
void addedge(int u,int v){
	e[++cnt].from=u;
	e[cnt].to=v;
	e[cnt].val=dis(u,v);
}
bool cmp(edge a,edge b){
	return a.val<b.val;
}
int fuck(int k){
	if(fa[k]==k)return k;
	else return fa[k]=fuck(fa[k]); 
}
int kruskal(int lim){
	for(int i=1;i<=n;i++)fa[i]=i;
	int ecnt=0;
	for(int i=1;i<=cnt;i++){
		if(e[i].val>lim&&ecnt<n-1)return 0;//如果已经到达限制但没能联通 
		int p=fuck(e[i].from),q=fuck(e[i].to);
		if(p==q)continue;
		fa[p]=q;ecnt++;
	}
	return 1;//可以联通 
}
int main(){
	ios::sync_with_stdio(false);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>ju[i];
		minn=min(minn,ju[i]);
		maxn=max(maxn,ju[i]); //记录二分初始边界 
	}
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			addedge(i,j);//建图 
		}
	}
	stable_sort(e+1,e+cnt+1,cmp);//排序 
	stable_sort(ju+1,ju+m+1);//排序准备二分 
	int l=1,r=m,mid;
	while(l!=r){
		mid=(l+r)/2;
		if(kruskal(ju[mid])){//如果可以跑过 
			l=mid+1;
		}
		else{
			r=mid;//跑不过 
		}
	}
	cout<<l-1;
}
2021/12/12 14:34
加载中...