#include <iostream>
#include <queue>
const int N = 400 + 1;
char graph[N][N];
int dist[N][N];
void bfs(int u, int n) {
std::vector visited(N + 1, false);
std::queue<int> toVisit;
toVisit.push(u);
visited[u] = true;
for (int i = 1; i <= n; i++) {
dist[u][i] = N * 2;
}
dist[u][u] = 0;
while(!toVisit.empty()) {
auto visiting = toVisit.front();
toVisit.pop();
for (int i = 1; i <= n; i++) {
if (graph[visiting][i] == '1' && !visited[i]) {
toVisit.push(i);
visited[i] = true;
dist[u][i] = std::min(dist[u][visiting] + 1, dist[u][i]);
}
}
}
}
int main() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
int t;
std::cin >> t;
for (int testCase = 0; testCase < t; testCase++) {
int n;
std::cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
std::cin >> graph[i][j];
}
}
for (int i = 1; i <= n; i++) {
bfs(i, n);
}
int bestMaxDist = N * 2;
for (int t1 = 1; t1 <= n; t1++) {
for (int t2 = t1 + 1; t2 <= n; t2++) {
int maxDist = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int distance = std::min(dist[i][j], std::min(dist[i][t1] + dist[t2][j], dist[i][t2] + dist[t1][j]));
maxDist = std::max(maxDist, distance);
}
}
bestMaxDist = std::min(maxDist, bestMaxDist);
}
}
std::cout << bestMaxDist << "\n";
}
return 0;
}
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 | #include <iostream> #include <queue> const int N = 400 + 1; char graph[N][N]; int dist[N][N]; void bfs(int u, int n) { std::vector visited(N + 1, false); std::queue<int> toVisit; toVisit.push(u); visited[u] = true; for (int i = 1; i <= n; i++) { dist[u][i] = N * 2; } dist[u][u] = 0; while(!toVisit.empty()) { auto visiting = toVisit.front(); toVisit.pop(); for (int i = 1; i <= n; i++) { if (graph[visiting][i] == '1' && !visited[i]) { toVisit.push(i); visited[i] = true; dist[u][i] = std::min(dist[u][visiting] + 1, dist[u][i]); } } } } int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int t; std::cin >> t; for (int testCase = 0; testCase < t; testCase++) { int n; std::cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { std::cin >> graph[i][j]; } } for (int i = 1; i <= n; i++) { bfs(i, n); } int bestMaxDist = N * 2; for (int t1 = 1; t1 <= n; t1++) { for (int t2 = t1 + 1; t2 <= n; t2++) { int maxDist = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { int distance = std::min(dist[i][j], std::min(dist[i][t1] + dist[t2][j], dist[i][t2] + dist[t1][j])); maxDist = std::max(maxDist, distance); } } bestMaxDist = std::min(maxDist, bestMaxDist); } } std::cout << bestMaxDist << "\n"; } return 0; } |
English