#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"; } } } |
English