#include <algorithm>
#include <cassert>
#include <cstdio>
#include <limits>
#include <vector>
int distance[400][400];
const int MAX = 1000;
struct Route {
int i, j;
int distance;
bool operator<(const Route& r) const {
return distance > r.distance;
}
};
int main() {
std::vector<Route> routes;
int T; scanf("%d\n", &T);
while (T-- > 0) {
int N; scanf("%d\n", &N);
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
char c = getchar();
if (i == j) {
distance[i][j] = 0;
} else if (c == '1') {
distance[i][j] = 1;
} else {
distance[i][j] = MAX;
}
}
assert(getchar() == '\n');
}
for (int k=0; k<N; ++k) {
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
distance[i][j] = std::min(distance[i][j], distance[i][k] + distance[k][j]);
}
}
}
routes.clear();
routes.reserve(N * N);
for (int j=0; j<N; ++j) {
for (int i=0; i<j; ++i) {
if (distance[i][j] > 1) {
routes.push_back({i, j, distance[i][j]});
}
}
}
std::sort(routes.begin(), routes.end());
int best_result = MAX;
for (int jT=0; jT<N; ++jT) {
for (int iT=0; iT<jT; ++iT) {
int max_dist = 1;
for (const Route& route : routes) {
if (distance[route.i][route.j] <= max_dist) {
break;
}
int dist = std::min(
distance[route.i][route.j],
std::min(
distance[route.i][iT] + distance[jT][route.j],
distance[route.i][jT] + distance[iT][route.j]
)
);
max_dist = std::max(max_dist, dist);
}
best_result = std::min(best_result, max_dist);
}
if (best_result == 1) {
break;
}
}
printf("%d\n", best_result);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <algorithm> #include <cassert> #include <cstdio> #include <limits> #include <vector> int distance[400][400]; const int MAX = 1000; struct Route { int i, j; int distance; bool operator<(const Route& r) const { return distance > r.distance; } }; int main() { std::vector<Route> routes; int T; scanf("%d\n", &T); while (T-- > 0) { int N; scanf("%d\n", &N); for (int i=0; i<N; ++i) { for (int j=0; j<N; ++j) { char c = getchar(); if (i == j) { distance[i][j] = 0; } else if (c == '1') { distance[i][j] = 1; } else { distance[i][j] = MAX; } } assert(getchar() == '\n'); } for (int k=0; k<N; ++k) { for (int i=0; i<N; ++i) { for (int j=0; j<N; ++j) { distance[i][j] = std::min(distance[i][j], distance[i][k] + distance[k][j]); } } } routes.clear(); routes.reserve(N * N); for (int j=0; j<N; ++j) { for (int i=0; i<j; ++i) { if (distance[i][j] > 1) { routes.push_back({i, j, distance[i][j]}); } } } std::sort(routes.begin(), routes.end()); int best_result = MAX; for (int jT=0; jT<N; ++jT) { for (int iT=0; iT<jT; ++iT) { int max_dist = 1; for (const Route& route : routes) { if (distance[route.i][route.j] <= max_dist) { break; } int dist = std::min( distance[route.i][route.j], std::min( distance[route.i][iT] + distance[jT][route.j], distance[route.i][jT] + distance[iT][route.j] ) ); max_dist = std::max(max_dist, dist); } best_result = std::min(best_result, max_dist); } if (best_result == 1) { break; } } printf("%d\n", best_result); } } |
English