// Witold Milewski
// PA 2025
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define FORB(i, b, a) for(int i=b; i>=a; --i)
#define sz(A) (int)(A.size())
#define eb emplace_back
#define pb push_back
#define pi pair<int, int>
#define f first
#define s second
#define rs resize
#define V vector
const int maxn=401, inf=500;
int n;
int A[maxn][maxn], D[maxn][maxn];
int dp[maxn][maxn][maxn];
int zlicz_bliskie[maxn];
bool check(int X) {
FOR(i, 1, n) zlicz_bliskie[i]=0;
FOR(a, 1, n) FOR(b, 1, n) FOR(c, 0, X) dp[a][b][c]=0;
FOR(i, 1, n) FOR(j, 1, n) {
if(i==j) continue;
if(D[i][j]<=X) {
++zlicz_bliskie[i];
continue;
}
FOR(v, 1, n) {
int d = D[v][j];
if(d<=X) ++dp[i][v][d];
}
}
FOR(i, 1, n) FOR(v, 1, n) FOR(d, 1, X) dp[i][v][d]+=dp[i][v][d-1];
FOR(la, 1, n) FOR(lb, la+1, n) {
int a = la;
int b = lb;
bool ok=1;
FOR(i, 1, n) {
if(D[a][i]<D[b][i]) swap(a, b);
int d = X-D[b][i];
int ile_par_dalekich=0;
if(d>=0) ile_par_dalekich = dp[i][a][d];
int ile_par_bliskich = zlicz_bliskie[i];
if(ile_par_bliskich+ile_par_dalekich!=n-1) {
ok=0;
break;
}
}
if(ok) return 1;
}
return 0;
}
void solve() {
cin >> n;
FOR(i, 1, n) FOR(j, 1, n) D[i][j]=inf;
FOR(i, 1, n) {
string s;
cin >> s;
FOR(j, 1, n) {
int x = s[j-1]-'0';
if(x==0) D[i][j]=inf;
else D[i][j]=1;
}
}
FOR(i, 1, n) D[i][i]=0;
FOR(a, 1, n) FOR(b, 1, n) FOR(c, 1, n) if(D[b][a]<inf && D[a][c]<inf) D[b][c]=min(D[b][c], D[b][a]+D[a][c]);
int lo=1, hi=n;
while(lo<hi) {
int mid = (lo+hi)/2;
if(check(mid)) hi=mid;
else lo=mid+1;
}
cout << lo << '\n';
}
signed main() {
cin.tie(0) -> ios_base::sync_with_stdio(0);
int q; cin >> q;
while(q--) 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 | // Witold Milewski // PA 2025 #include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i=a; i<=b; ++i) #define FORB(i, b, a) for(int i=b; i>=a; --i) #define sz(A) (int)(A.size()) #define eb emplace_back #define pb push_back #define pi pair<int, int> #define f first #define s second #define rs resize #define V vector const int maxn=401, inf=500; int n; int A[maxn][maxn], D[maxn][maxn]; int dp[maxn][maxn][maxn]; int zlicz_bliskie[maxn]; bool check(int X) { FOR(i, 1, n) zlicz_bliskie[i]=0; FOR(a, 1, n) FOR(b, 1, n) FOR(c, 0, X) dp[a][b][c]=0; FOR(i, 1, n) FOR(j, 1, n) { if(i==j) continue; if(D[i][j]<=X) { ++zlicz_bliskie[i]; continue; } FOR(v, 1, n) { int d = D[v][j]; if(d<=X) ++dp[i][v][d]; } } FOR(i, 1, n) FOR(v, 1, n) FOR(d, 1, X) dp[i][v][d]+=dp[i][v][d-1]; FOR(la, 1, n) FOR(lb, la+1, n) { int a = la; int b = lb; bool ok=1; FOR(i, 1, n) { if(D[a][i]<D[b][i]) swap(a, b); int d = X-D[b][i]; int ile_par_dalekich=0; if(d>=0) ile_par_dalekich = dp[i][a][d]; int ile_par_bliskich = zlicz_bliskie[i]; if(ile_par_bliskich+ile_par_dalekich!=n-1) { ok=0; break; } } if(ok) return 1; } return 0; } void solve() { cin >> n; FOR(i, 1, n) FOR(j, 1, n) D[i][j]=inf; FOR(i, 1, n) { string s; cin >> s; FOR(j, 1, n) { int x = s[j-1]-'0'; if(x==0) D[i][j]=inf; else D[i][j]=1; } } FOR(i, 1, n) D[i][i]=0; FOR(a, 1, n) FOR(b, 1, n) FOR(c, 1, n) if(D[b][a]<inf && D[a][c]<inf) D[b][c]=min(D[b][c], D[b][a]+D[a][c]); int lo=1, hi=n; while(lo<hi) { int mid = (lo+hi)/2; if(check(mid)) hi=mid; else lo=mid+1; } cout << lo << '\n'; } signed main() { cin.tie(0) -> ios_base::sync_with_stdio(0); int q; cin >> q; while(q--) solve(); } |
English