70pts求调
查看原帖
70pts求调
464732
luqyou楼主2023/8/31 16:11
#include<bits/stdc++.h>
using namespace std;
const int maxn=150+10;
int n,x[maxn],y[maxn];
double f[maxn][maxn],ans=1145141919;
double dis(int X1,int Y1,int X2,int Y2){
	return sqrt((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2));
} 
int main(){
//    ios::sync_with_stdio(false);
//    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>x[i]>>y[i]; 
	}
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		s=" "+s;
		for(int j=1;j<=n;j++){
			if(s[j]=='0'){
				f[i][j]=1145141919;
			}
			else{
				f[i][j]=dis(x[i],y[i],x[j],y[j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		f[i][i]=0;
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
			} 
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i!=j&&f[i][j]==1145141919){
				double max1=-1,max2=-1;
				for(int k=1;k<=n;k++){
					if(i!=k&&f[i][k]!=1145141919){
						max1=max(max1,f[i][k]);
					}
					if(j!=k&&f[j][k]!=1145141919){
						max2=max(max2,f[j][k]);
					}
				}
				ans=min(ans,max1+max2+dis(x[i],y[i],x[j],y[j]));
			}
		}
	}
	printf("%.6lf",ans);
    return 0;
}
2023/8/31 16:11
加载中...