#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1e3 + 10;
int a[N], b[N], n;
double f[N][N], d[N], dis[N][N];
int main(void) {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i] >> b[i];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
dis[i][j] = sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));
string ch;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
f[i][j] = 1e8;
for (int i = 1; i <= n; ++i)
f[i][i] = 0.0;
for (int i = 1; i <= n; ++i) {
cin >> ch;
for (int j = 0; j < ch.size(); ++j) {
if (ch[j] == '1')f[i][j + 1] = dis[i][j + 1];
}
}
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (i != j && i != k && j != k && f[i][k] < 1e8 && f[k][j] < 1e8)
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (f[i][j] != 1e8)
d[i] = max(f[i][j], d[i]);
}
}
double ans = 1e8;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i == j)continue;
if (f[i][j] == 1e8) {
ans = min(ans, dis[i][j] + d[i] + d[j]);
}
}
}
for (int i = 1; i <= n; ++i)
ans = max(ans, d[i]);
printf("%0.6lf", ans);
return 0;
}
这样交上去第第七个点会WA
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i == j)continue;
if (f[i][j] == 2e9) {
ans = min(ans, dis[i][j] + d[i] + d[j]);
}
}
ans = max(ans, d[i]);
}
但是如果把ans = max(ans , d[i])提到外面去就A了
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i == j)continue;
if (f[i][j] == 1e8) {
ans = min(ans, dis[i][j] + d[i] + d[j]);
}
}
}
for (int i = 1; i <= n; ++i)
ans = max(ans, d[i]);