题目链接:Acwing_1125牛的旅行
AC代码:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 152;
const double INF = 1e20;
typedef pair<int, int> PII;
PII q[N];
char g[N][N];
double d[N][N], maxd[N];
double get_dist(PII a, PII b) {
int x = a.first - b.first, y = a.second - b.second;
return sqrt(x * x + y * y);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> q[i].first >> q[i].second;
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) d[i][j] = 0;
else if (g[i][j] == '1') d[i][j] = get_dist(q[i], q[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]);
double res1 = 0, res2 = INF;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {//求i到离i最远点的距离
if (d[i][j] < INF / 2) maxd[i] = max(maxd[i], d[i][j]);
}
res1 = max(res1, maxd[i]);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {//连线操作,更新新牧场直径
if (d[i][j] > INF / 2) res2 = min(res2, maxd[i] + maxd[j] + get_dist(q[i], q[j]));
}
}
printf("%.6lf\n", max(res1, res2));
return 0;
}