求助
查看原帖
求助
422171
Gold_Dino楼主2022/8/5 00:05
#include <bits/stdc++.h>

using std :: cin;
using std :: min;
using std :: max;

struct coord
{
	int x, y;
};

int n, map[155][155]; coord arr[155];
double dis[155][155], maxx[155], ans1, ans2 = 1e11;

double H_size(coord a, coord b)
{
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

int main()
{
	int i, j, k;
	
	scanf("%d", & n);
	
	for (i = 1; i <= n; i++)
		scanf("%d %d", & arr[i].x, & arr[i].y);
	
	char c;
	
	for (i = 1; i <= n; i++)
	{
		scanf("%c", & c);
		
		for (j = 1; j <= n; j++)
		{
			scanf("%c", & c);
			
			map[i][j] = c - '0';
			
			if (c == '0' && i != j)
				dis[i][j] = 1e11;
			
			if (c == '1')
				dis[i][j] = H_size(arr[i], arr[j]);
		}
	}
	
	for (k = 1; k <= n; k++)
		for (i = 1; i <= n; i++)
			for (j = 1; j <= n; j++)
				if (dis[i][k] + dis[k][j] < dis[i][j])
					dis[i][j] = dis[i][k] + dis[k][j];
	
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			if (dis[i][j] < 1e11)
			{
				maxx[i] = max(maxx[i], dis[i][j]);
				
				ans1 = max(ans1, maxx[i]);
				
				map[i][j] = 1;
			}
	
	for (i = 1; i <= n; i++)
		for (j = i + 1; j <= n; j++)
			if (map[i][j] == 0)
				ans2 = min(ans2, H_size(arr[i], arr[j]) + maxx[i] + maxx[j]);
//				printf("%.1f ", H_size(arr[i], arr[j]) + maxx[i] + maxx[j]);
//	printf("\n");
	
//	for (i = 1; i <= n; i++)
//		printf("%.1f ", maxx[i]);
//	printf("\n");
//	
	printf("%.6f\n", (ans1 > ans2) ? ans1 : ans2);
	
	return 0;
}
2022/8/5 00:05
加载中...