代码求调
查看原帖
代码求调
1046945
MMRailgun楼主2024/5/24 13:34
#include<algorithm>
#include<climits>
#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;

const int maxn=170;
const double INF=INT_MAX-1;
int n;

struct position{
	int x, y;
	double distance(const position &d){
		return sqrt((x - d.x) * (x - d.x) + (y - d.y) * (y - d.y));
	}
}a[maxn];

double diameter[maxn]= {0};
double ma[maxn][maxn];
int fid[maxn]= {0};
double map_sp[maxn]= {0.0};

void dfs(int i, int id) {
	fid[i]=id;
//	cout<<i<<" ";
	for(int k=1; k<=n; k++)
		if(!fid[k]&&ma[i][k]<INF)
			dfs(k, id);
}

int main() {
	
	cin>>n;
	
	for(int i=1; i<=n; i++)
		cin>>a[i].x>>a[i].y;
	//初始化 
	char s[maxn];	
	for(int i=1; i<=n; i++){
		cin>>s;
		for(int j=1; j<=n; j++) 
			if(s[j]=='1'||i==j)
				ma[i][j]=a[i].distance(a[j]);
			else
				ma[i][j]=INF;
	}
	//dfs	
	int id=0;
	for(int i=1; i<=n; i++)
		if(!fid[i])
			dfs(i, ++id);
	//floyd	
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			for(int k=1; k<=n; k++)
                if(ma[j][k]>ma[j][i]+ma[i][k])
				    ma[j][k]=ma[j][i]+ma[i][k];
	//查找最大最短路与直径			
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++)
			if(ma[i][j]<INF)
				map_sp[i]=max(map_sp[i], ma[i][j]);
		diameter[fid[i]]=max(diameter[fid[i]], map_sp[i]);
	}
                             
	// ans
                             
	double min_d = INF, max_d=-INF;
	for (int i = 1; i <= n; i++)
		for (int j = i + 1; j <= n; j++)
			if (fid[i] != fid[j]) {
				max_d = max(diameter[fid[i]], diameter[fid[j]]);
				max_d = max(max_d, map_sp[i] + a[i].distance(a[j]) + map_sp[j]);
				min_d = min(min_d, max_d);
			}
			
	printf("%.6f\n",min_d);
	
	return 0;
}

为什么将范围从[1,n]改到[0,n)就可以过

而从[1,n]就会输出奇怪的答案呢

求dalao解释

orz 十分感谢

2024/5/24 13:34
加载中...