80pts#WA7,9求调
查看原帖
80pts#WA7,9求调
623089
ZZ_WYZ楼主2024/9/24 18:36
#include<bits/stdc++.h>
using namespace std;
long double dis(int x,int y,int a,int b){
	return sqrt(pow(x-a,2)+pow(y-b,2));
}
int f[1145];
int Find(int x){
	if(f[x]!=x)return Find(f[x]);
	else return x;
}
void hebing(int x,int y){
	int a=Find(x);
	int b=Find(y);
	if(a!=b)f[x]=y;
}
int n;
long double fl[200][200],maxn[200],ans=1045141919;
char o[200][200];
long double pl[200],pr[200];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>pl[i]>>pr[i];
	}
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			fl[i][j]=1040000010.0;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>o[i][j];
			if(o[i][j]=='1'){
				fl[i][j]=dis(pl[i],pr[i],pl[j],pr[j]);
				hebing(i,j);
			}
		}
	}
	for(int i=1;i<=n;i++){
		f[i]=Find(i);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(f[i]==f[j]&&i!=j)o[i][j]='1';
		} 
	}
	
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(o[i][k]!='0'&&o[k][j]!='0'&&o[i][j]!='0'&&i!=j&&j!=k&&i!=k)fl[i][j]=min(fl[i][k]+fl[k][j],fl[i][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		maxn[i]=0;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(o[i][j]=='1'&&i!=j)maxn[i]=max(maxn[i],fl[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i!=j&&o[i][j]=='0'){
				ans=min(maxn[i]+maxn[j]+dis(pl[i],pr[i],pl[j],pr[j]),ans);
			}
		}
	}
	cout<<setprecision(6)<<fixed<<ans;
	return 0;
}
2024/9/24 18:36
加载中...