20pts求助
查看原帖
20pts求助
203008
山田リョウ楼主2021/10/22 11:28
#include<stdio.h>
#include<cmath>
double a[151][151],maxdis[151];int x[151],y[151];
char str[151];
inline int sq(int a){return a*a;}
inline double dist(int a,int b){return std::sqrt(sq(x[a]-x[b])+sq(y[a]-y[b]));}
inline double min(double a,double b){return a<b?a:b;}
int main(){
	int n;scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);
	for(int i=1;i<=n;++i){
		getchar();
		for(int j=1;j<=n;++j){
			if(getchar()=='1'||i==j)
				a[i][j]=a[j][i]=dist(i,j);
			else
				a[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(a[i][k]!=-1&&a[k][j]!=-1)
					if(a[i][j]==-1||a[i][j]>a[i][k]+a[k][j])
						a[i][j]=a[i][k]+a[k][j];
	for(int i=1;i<=n;++i){
		maxdis[i]=0;
		for(int j=1;j<=n;++j)
			maxdis[i]=maxdis[i]<a[i][j]?a[i][j]:maxdis[i];
	}
	double ans1=-1,ans2=0x3f3f3f3f;
	for(int i=1;i<=n;++i)
		ans1=ans1>maxdis[i]?ans1:maxdis[i];
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(a[i][j]==-1)
				ans2=min(ans2,maxdis[i]+maxdis[j]+dist(i,j));
	printf("%.6lf",ans1>ans2?ans1:ans2);
	return 0;
}

本地测是过了,在线ide上不知道为啥就锅了,求助!

2021/10/22 11:28
加载中...