#include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while (t--) { int n; cin >> n; string s; vector<vector<int>> d(n, vector<int>(n, n + 1)); for (int i = 0; i < n; i++) { cin >> s; for (int j = 0 ; j < n; j++) { if (s[j] == '1') d[i][j] = 1; } d[i][i] = 0; } // floyd 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]); } } } if (n > 150) { int answer = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { answer = max(answer, d[i][j]); } } auto check = [&](int x) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { bool ok = true; for (int z = 0; z < n; z++) { if (min(d[i][z], d[j][z]) > x) { ok = false; break; } } if (ok) return true; } } return false; }; int lo = 0, hi = n - 1; while (lo < hi) { int mid = (lo + hi) >> 1; if (check(mid)) hi = mid; else lo = mid + 1; } answer = min(answer, 2 * lo); cout << answer << "\n"; } else { int answer = n + 1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int max_dist = 0; for (int x = 0; x < n; x++) { for (int y = 0; y < n; y++) { int dist = min(d[x][y], min(d[x][i] + d[j][y], d[x][j] + d[i][y])); max_dist = max(max_dist, dist); } } answer = min(answer, max_dist); } } cout << answer << "\n"; } } }
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 | #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while (t--) { int n; cin >> n; string s; vector<vector<int>> d(n, vector<int>(n, n + 1)); for (int i = 0; i < n; i++) { cin >> s; for (int j = 0 ; j < n; j++) { if (s[j] == '1') d[i][j] = 1; } d[i][i] = 0; } // floyd 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]); } } } if (n > 150) { int answer = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { answer = max(answer, d[i][j]); } } auto check = [&](int x) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { bool ok = true; for (int z = 0; z < n; z++) { if (min(d[i][z], d[j][z]) > x) { ok = false; break; } } if (ok) return true; } } return false; }; int lo = 0, hi = n - 1; while (lo < hi) { int mid = (lo + hi) >> 1; if (check(mid)) hi = mid; else lo = mid + 1; } answer = min(answer, 2 * lo); cout << answer << "\n"; } else { int answer = n + 1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int max_dist = 0; for (int x = 0; x < n; x++) { for (int y = 0; y < n; y++) { int dist = min(d[x][y], min(d[x][i] + d[j][y], d[x][j] + d[i][y])); max_dist = max(max_dist, dist); } } answer = min(answer, max_dist); } } cout << answer << "\n"; } } } |