#9 WA 求助
查看原帖
#9 WA 求助
500240
Quirrel_dog楼主2023/5/5 19:27
#include <bits/stdc++.h>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;

const int N = 150;
const double INF=1e20;

int n;
int fa[1000000];
PII q[N];
char g[N][N];
double d[N][N],maxd[N];

int find(int x)
{
 	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}

bool together(int a,int b)
{
	return find(a)==find(b);
}

void join(int a,int b)
{
	int f1=find(a),f2=find(b);
	if(f1!=f2) fa[f1]=f2;
}

double get_dist(PII a,PII b)
{
	double dx=a.x-b.x,dy=a.y-b.y;
	return sqrt(dx*dx+dy*dy);
}

signed main()
{
	cin>>n;
	for(int i = 0;i<n;i++) cin>>q[i].x>>q[i].y,fa[i]=i;
	for(int i = 0;i<n;i++) cin>>g[i];
	
	for(int i = 0;i<n;i++)
		for(int j = 0;j<n;j++)
		{
			if(i!=j)
			{
				if(g[i][j]=='1')
				{
					d[i][j]=get_dist(q[i],q[j]);
					join(i,j);
				}
				else d[i][j]=INF;
			}
		}
			
	for(int k = 0;k<n;k++)
		for(int i = 0;i<n;i++)
			for(int j = 0;j<n;j++)
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
				
	for(int i = 0;i<n;i++)
		for(int j = 0;j<n;j++)
		{
			if(d[i][j] < INF&&together(i,j))
				maxd[i]=max(maxd[i],d[i][j]);
		}
				
	int m1,m2;
	double res1=0;
	for(int i = 0;i<n;i++) if(res1<maxd[i]) res1=maxd[i],m1=find(i);

	double res2=INF;
	for(int i = 0;i<n;i++)
		for(int j = 0;j<n;j++)
			if(d[i][j]>=INF&&res2>get_dist(q[i],q[j])+maxd[i]+maxd[j])
				res2=get_dist(q[i],q[j])+maxd[i]+maxd[j],m2=find(i);

	if(m1==m2||res1==0)	printf("%lf\n",fmax(res1,res2));
	else		printf("%lf\n",fmin(res1,res2));
	// cout<<res1<<" "<<res2;
	return 0;
}

貌似是判连通块时判错了,但找不到错哪了,求助大佬

2023/5/5 19:27
加载中...