WA#7求调
查看原帖
WA#7求调
1047694
Shq_likes_AC楼主2024/7/26 13:26

输出 22693.89398622693.893986,答案 39796.39269139796.392691

#include <bits/stdc++.h>
using namespace std;
double g[165][165], n,  dp[165][165], mx1[165], mx2[165], flag = 1e+250, ans = 1e+250;
long long f[165][165],number[165],id;
struct point
{
	long long x, y;
	friend double operator - (point a, point b)
	{
		return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) * 1.0);
	}
	friend istream& operator >> (istream& in, point& b)
	{
		in >> b.x >> b.y;
		return in;
	}
}p[165];
void DFS(int id, int k)
{
	number[k] = id;
	for (int i = 1; i <= n; i++)
		if (!number[i] && f[k][i])
			DFS(id, i);
}
int main()
{
	char ch;
	cin >> n;
	memset(dp, 125, sizeof(dp));
	for (int i = 1; i <= n; i++)
		cin >> p[i];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> ch, f[i][j] = ch - 48, g[i][j] = p[i] - p[j];
	for (int i = 1; i <= n; i++)
		if (!number[i])
			DFS(++id, i);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (i == j)
				dp[i][j] = 0;
			else if (f[i][j])
				dp[i][j] = g[i][j];
			
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 1; k <= n; k++)
				dp[j][k] = min(dp[j][k], dp[j][i] + dp[i][k]);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (dp[i][j] < flag)
				mx1[number[i]] = max(mx1[number[i]], dp[i][j]), mx2[i] = max(mx2[i], dp[i][j]);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (dp[i][j] > flag)
				ans = min(ans, max(max(mx1[number[i]], mx1[number[i]]), mx2[i] + mx2[j] + g[i][j]));
	printf("%.6f", ans);
}
2024/7/26 13:26
加载中...