//n^4 bru
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,p,q) for(int i=(p); i<=(q); ++i)
#define ROF(i,p,q) for(int i=(p); i>=(q); --i)
#define REP(i,q) for(int i=0; i<(q); ++i)
#define pb push_back
#define as assign
#define rz resize
#define Co const
#define fi first
#define se second
#define all(X) X.begin(), X.end()
#define rall(X) X.rbegin(), X.rend()
#define sz(X) (int)(X.size())
#define ckmax(a,b) a=max(a,b)
#define ckmin(a,b) a=min(a,b)
#define V vector
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
typedef mt19937_64 mt;
#ifndef UNCLE
typedef basic_string<bool> vb;
typedef basic_string<int> vi;
typedef basic_string<ll> vl;
#else
typedef V<bool> vb;
typedef V<int> vi;
typedef V<ll> vl;
#endif
constexpr int INF=1e9;
int N;
V<vi> dis;
struct RG{int p,q;};
void Input(){
cin>>N;
dis.as(N,vi(N,INF));
REP(v,N){
string s; cin>>s;
REP(u,N){
if(u==v) dis[v][u]=0;
else if(s[u]=='1') dis[v][u]=1;
}
}
}
bool IsPos(int k, mt &rng){
vi vs;
V<RG> rgs;
FOR(q,0,N-1){
vs.pb(q);
FOR(p,0,q-1) rgs.pb({p,q});
}
shuffle(all(vs),rng), shuffle(all(rgs),rng);
for(int v:vs){
vi mxDis(N,-INF);
bool isG=1;
FOR(u,v+1,N-1) if(dis[v][u]>k){
isG=0;
REP(w,N) ckmax(mxDis[w],dis[w][u]);
}
if(isG) continue;
ROF(i,sz(rgs)-1,0){
if(dis[v][rgs[i].p]<dis[v][rgs[i].q]){
if(dis[v][rgs[i].p]+mxDis[rgs[i].q]>k) swap(rgs[i],rgs.back()), rgs.pop_back();
}else{
if(dis[v][rgs[i].q]+mxDis[rgs[i].p]>k) swap(rgs[i],rgs.back()), rgs.pop_back();
}
}
if(rgs.empty()) return 0;
}
return 1;
}
void Solve(){
Input();
mt rng0(14);
mt rng(rng0());
REP(k,N) REP(u,N) REP(v,N) ckmin(dis[u][v],dis[u][k]+dis[k][v]);
int p=0,m,q=N;
while(p<=q){
m=(p+q)/2;
if(IsPos(m,rng)) q=m-1;
else p=m+1;
}
cout<<(m=q+1)<<"\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T; 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 | //n^4 bru #include <bits/stdc++.h> using namespace std; #define FOR(i,p,q) for(int i=(p); i<=(q); ++i) #define ROF(i,p,q) for(int i=(p); i>=(q); --i) #define REP(i,q) for(int i=0; i<(q); ++i) #define pb push_back #define as assign #define rz resize #define Co const #define fi first #define se second #define all(X) X.begin(), X.end() #define rall(X) X.rbegin(), X.rend() #define sz(X) (int)(X.size()) #define ckmax(a,b) a=max(a,b) #define ckmin(a,b) a=min(a,b) #define V vector typedef long long ll; typedef long double ld; typedef pair<int,int> pi; typedef pair<ll,ll> pl; typedef mt19937_64 mt; #ifndef UNCLE typedef basic_string<bool> vb; typedef basic_string<int> vi; typedef basic_string<ll> vl; #else typedef V<bool> vb; typedef V<int> vi; typedef V<ll> vl; #endif constexpr int INF=1e9; int N; V<vi> dis; struct RG{int p,q;}; void Input(){ cin>>N; dis.as(N,vi(N,INF)); REP(v,N){ string s; cin>>s; REP(u,N){ if(u==v) dis[v][u]=0; else if(s[u]=='1') dis[v][u]=1; } } } bool IsPos(int k, mt &rng){ vi vs; V<RG> rgs; FOR(q,0,N-1){ vs.pb(q); FOR(p,0,q-1) rgs.pb({p,q}); } shuffle(all(vs),rng), shuffle(all(rgs),rng); for(int v:vs){ vi mxDis(N,-INF); bool isG=1; FOR(u,v+1,N-1) if(dis[v][u]>k){ isG=0; REP(w,N) ckmax(mxDis[w],dis[w][u]); } if(isG) continue; ROF(i,sz(rgs)-1,0){ if(dis[v][rgs[i].p]<dis[v][rgs[i].q]){ if(dis[v][rgs[i].p]+mxDis[rgs[i].q]>k) swap(rgs[i],rgs.back()), rgs.pop_back(); }else{ if(dis[v][rgs[i].q]+mxDis[rgs[i].p]>k) swap(rgs[i],rgs.back()), rgs.pop_back(); } } if(rgs.empty()) return 0; } return 1; } void Solve(){ Input(); mt rng0(14); mt rng(rng0()); REP(k,N) REP(u,N) REP(v,N) ckmin(dis[u][v],dis[u][k]+dis[k][v]); int p=0,m,q=N; while(p<=q){ m=(p+q)/2; if(IsPos(m,rng)) q=m-1; else p=m+1; } cout<<(m=q+1)<<"\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); int T; cin>>T; while(T--) Solve(); } |
English