求助
查看原帖
求助
570262
Dynasty_Teng楼主2024/10/15 08:40
#include<bits/stdc++.h>
#define inf 100009
using namespace std;
const int N=200;
int n;
struct node {
	int x,y;
	double dis(const node &b)
	{
		return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y));
	}
}a[N];
double dist[N][N];
int f[N],g[N][N];
double ans=inf;
double maxd[N],ad[N];
int find(int x)
{
	if(f[x]==x)
	return x;
	f[x]=find(f[x]);
	return f[x];
}

void  merge(int x,int y)
{
	int a=find(x),b=find(y);
	if(a==b)
	return;
	f[a]=b;
}
int main()
{
	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
	}
		for(int i=1;i<=n;i++)
		f[i]=i;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		int k;
		scanf("%1d",k);
		if(k==1||i==j)
		{
				dist[i][j]=a[i].dis(a[j]);
				merge(i,j);
		}
		else
			dist[i][j]=inf;
	}
		

	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
	}
	
	for(int i=1;i<=n;i++)
	for(int j=i+1;j<=n;j++)
	{
		int x=find(i),y=find(j);
		if(x==y)
		maxd[i]=max(dist[i][j],maxd[i]);
		ad[x]=max(ad[x],maxd[i]); 
	}
	
	for(int i=1;i<=n;i++)
	for(int j=i+1;j<=n;j++)
	{
		int x=find(i),y=find(j);
		if(x!=y)
		{
			ans=min(ans,max(maxd[i]+maxd[j]+a[i].dis(a[j]),max(ad[x],ad[y])));
		}
	}
	printf("%.6lf",ans);
	return 0;
}

代码中的ad数组与maxd数组借鉴于题解,但是不太能理解代表什么含义。

2024/10/15 08:40
加载中...