输出 22693.893986,答案 39796.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);
}