#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 410; const int INF = 1e9; int d[N][N], k[N][N], n; vector<int> g[N]; bool check(int m) { for (int x=1; x<=n; ++x) { for (int y=1; y<=n; ++y) { if (d[x][y] > m) { g[x].push_back(y); } } } for (int x=1; x<=n; ++x) { for (int v=1; v<=n; ++v) { k[x][v] = -INF; for (auto y : g[x]) { k[x][v] = max(k[x][v], d[v][y]); } } } for (int v=1; v<=n; ++v) { for (int u=v+1; u<=n; ++u) { bool ok = true; for (int x=1; x<=n; ++x) { if (d[x][u] >= d[x][v]) { if (k[x][u] > m-d[x][v]) { ok = false; break; } } else { if (k[x][v] > m-d[x][u]) { ok = false; break; } } } if (ok) return true; } } for (int i=1; i<=n; ++i) g[i].clear(); return false; } void solve() { cin>>n; for (int i=1; i<=n; ++i) { string s; cin>>s; for (int j=1; j<=n; ++j) { if (s[j-1] == '1') d[i][j] = 1; else d[i][j] = INF; } d[i][i] = 0; } for (int k=1; k<=n; ++k) { for (int i=1; i<=n; ++i) { for (int j=1; j<=n; ++j) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } int l=1, r = n, ans = n; while (l <= r) { int m = (l+r)/2; if (check(m)) { r=m-1; ans = m; } else { l = m+1; } } cout<<ans<<"\n"; for (int i=0; i<=n; ++i) g[i].clear(); for (int i=0; i<=n; ++i) { for (int j=0; j<=n; ++j) k[i][j] = 0, d[i][j] = 0; } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); int t=1; cin>>t; while (t--) solve(); }
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 410; const int INF = 1e9; int d[N][N], k[N][N], n; vector<int> g[N]; bool check(int m) { for (int x=1; x<=n; ++x) { for (int y=1; y<=n; ++y) { if (d[x][y] > m) { g[x].push_back(y); } } } for (int x=1; x<=n; ++x) { for (int v=1; v<=n; ++v) { k[x][v] = -INF; for (auto y : g[x]) { k[x][v] = max(k[x][v], d[v][y]); } } } for (int v=1; v<=n; ++v) { for (int u=v+1; u<=n; ++u) { bool ok = true; for (int x=1; x<=n; ++x) { if (d[x][u] >= d[x][v]) { if (k[x][u] > m-d[x][v]) { ok = false; break; } } else { if (k[x][v] > m-d[x][u]) { ok = false; break; } } } if (ok) return true; } } for (int i=1; i<=n; ++i) g[i].clear(); return false; } void solve() { cin>>n; for (int i=1; i<=n; ++i) { string s; cin>>s; for (int j=1; j<=n; ++j) { if (s[j-1] == '1') d[i][j] = 1; else d[i][j] = INF; } d[i][i] = 0; } for (int k=1; k<=n; ++k) { for (int i=1; i<=n; ++i) { for (int j=1; j<=n; ++j) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } int l=1, r = n, ans = n; while (l <= r) { int m = (l+r)/2; if (check(m)) { r=m-1; ans = m; } else { l = m+1; } } cout<<ans<<"\n"; for (int i=0; i<=n; ++i) g[i].clear(); for (int i=0; i<=n; ++i) { for (int j=0; j<=n; ++j) k[i][j] = 0, d[i][j] = 0; } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); int t=1; cin>>t; while (t--) solve(); } |