最后一个点没过 求助
查看原帖
最后一个点没过 求助
601142
hnoi楼主2023/4/30 09:04
#include <bits/stdc++.h>
using namespace std;
const int maxn=150+5;
double m[maxn][maxn],l[maxn];
int x[maxn],y[maxn];
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			char x1;
			cin>>x1;
			int x2=x1-'0';
			if(x2==0){
				if(i!=j) m[i][j]=2e9;
			}
			else m[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
		}
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				m[i][j]=min(m[i][j],m[i][k]+m[k][j]);
			}
		}
	}
	double ans1=2e9,ans2=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(m[i][j]<2e9) l[i]=max(l[i],m[i][j]);
			ans2=max(ans2,l[i]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(m[i][j]>=2e9) ans1=min(l[i]+l[j]+sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])),ans1);
		}
	}
	ans1=max(ans1,ans2);
	printf("%.6f",ans1);
	
}7
2023/4/30 09:04
加载中...