// what is matter? never mind.
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2")
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define ull unsigned long long
//#define int long long
#define SZ(x) ((int)((x).size()))
#define ALL(x) (x).begin(),(x).end()
using namespace std;
inline int read()
{
char c=getchar();int x=0;bool f=0;
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
return f?-x:x;
}
#define mod 998244353
struct modint{
unsigned int x;
modint(int o=0){x=o;}
modint &operator = (int o){return x=o,*this;}
modint &operator +=(modint o){return x=x+o.x>=mod?x+o.x-mod:x+o.x,*this;}
modint &operator -=(modint o){return x=x<o.x?x-o.x+mod:x-o.x,*this;}
modint &operator *=(modint o){return x=1ll*x*o.x%mod,*this;}
modint &operator ^=(int b){
modint a=*this,c=1;
for(;b;b>>=1,a*=a)if(b&1)c*=a;
return x=c.x,*this;
}
modint &operator /=(modint o){return *this *=o^=mod-2;}
friend modint operator +(modint a,modint b){return a+=b;}
friend modint operator -(modint a,modint b){return a-=b;}
friend modint operator *(modint a,modint b){return a*=b;}
friend modint operator /(modint a,modint b){return a/=b;}
friend modint operator ^(modint a,int b){return a^=b;}
friend bool operator ==(modint a,modint b){return a.x==b.x;}
friend bool operator !=(modint a,modint b){return a.x!=b.x;}
bool operator ! () {return !x;}
modint operator - () {return x?mod-x:0;}
bool operator <(const modint&b)const{return x<b.x;}
};
inline modint qpow(modint x,int y){return x^y;}
vector<modint> fac,ifac,iv;
inline void initC(int n)
{
if(iv.empty())fac=ifac=iv=vector<modint>(2,1);
int m=iv.size(); ++n;
if(m>=n)return;
iv.resize(n),fac.resize(n),ifac.resize(n);
For(i,m,n-1){
iv[i]=iv[mod%i]*(mod-mod/i);
fac[i]=fac[i-1]*i,ifac[i]=ifac[i-1]*iv[i];
}
}
inline modint C(int n,int m){
if(m<0||n<m)return 0;
return initC(n),fac[n]*ifac[m]*ifac[n-m];
}
inline modint sign(int n){return (n&1)?(mod-1):(1);}
#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;
#define maxn 505
#define inf 0x3f3f3f3f
int n,dis[maxn][maxn];
char s[maxn];
int c[maxn][maxn],all;
int mx[maxn][maxn],p[maxn][maxn];
void sub(int u,int v){
if(u>v)swap(u,v);
if(c[u][v])c[u][v]=0,--all;
}
int ps[maxn],qs[maxn][maxn];
void work(int up){
// cout<<"work "<<up<<endl;
For(i,1,n){
int *p=::p[i];
while(dis[i][p[ps[i]]]>up){
int u=p[ps[i]];
For(j,1,n)
mx[i][j]=max(mx[i][j],dis[p[j]][u]);
--ps[i];
}
if(ps[i]==n) continue;
For(j,1,n){
int v=p[j];
while(qs[i][j]>=1){
int u=p[qs[i][j]];
if(dis[i][u]+mx[i][j]<=up) break;
// cout<<"sub "<<i<<" "<<u<<" "<<v<<endl;
sub(u,v);
--qs[i][j];
}
// dis(i,u) + mx[v] > up: baodiao u
}
}
// For(i,1,n){
// For(j,i+1,n) cout<<c[i][j]<<" "; cout<<"\n";
// }
}
void work()
{
n=read();
For(i,1,n){
scanf("%s",s+1);
For(j,1,n)dis[i][j]=(s[j]&1)?1:inf;
dis[i][i]=0;
}
For(k,1,n)For(i,1,n)For(j,1,n)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
all=0;
For(i,1,n)For(j,i+1,n)c[i][j]=n,++all;
For(i,1,n){
For(j,1,n)p[i][j]=j;
sort(p[i]+1,p[i]+n+1,[&](int u,int v){
return dis[i][u]<dis[i][v];
});
ps[i]=n;
For(j,1,n) qs[i][j]=j-1,mx[i][j]=-inf;
}
Rep(i,n-1,1){
work(i);
if(!all){
cout<<i+1<<endl;
return;
}
}
cout<<1<<endl;
}
signed main()
{
int T=read();
while(T--)work();
return 0;
}
/*
2
4
0111
1011
1101
1110
5
01000
10100
01010
00101
00010
*/
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | // what is matter? never mind. #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") //#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2") #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);++i) #define Rep(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define ull unsigned long long //#define int long long #define SZ(x) ((int)((x).size())) #define ALL(x) (x).begin(),(x).end() using namespace std; inline int read() { char c=getchar();int x=0;bool f=0; for(;!isdigit(c);c=getchar())f^=!(c^45); for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48); return f?-x:x; } #define mod 998244353 struct modint{ unsigned int x; modint(int o=0){x=o;} modint &operator = (int o){return x=o,*this;} modint &operator +=(modint o){return x=x+o.x>=mod?x+o.x-mod:x+o.x,*this;} modint &operator -=(modint o){return x=x<o.x?x-o.x+mod:x-o.x,*this;} modint &operator *=(modint o){return x=1ll*x*o.x%mod,*this;} modint &operator ^=(int b){ modint a=*this,c=1; for(;b;b>>=1,a*=a)if(b&1)c*=a; return x=c.x,*this; } modint &operator /=(modint o){return *this *=o^=mod-2;} friend modint operator +(modint a,modint b){return a+=b;} friend modint operator -(modint a,modint b){return a-=b;} friend modint operator *(modint a,modint b){return a*=b;} friend modint operator /(modint a,modint b){return a/=b;} friend modint operator ^(modint a,int b){return a^=b;} friend bool operator ==(modint a,modint b){return a.x==b.x;} friend bool operator !=(modint a,modint b){return a.x!=b.x;} bool operator ! () {return !x;} modint operator - () {return x?mod-x:0;} bool operator <(const modint&b)const{return x<b.x;} }; inline modint qpow(modint x,int y){return x^y;} vector<modint> fac,ifac,iv; inline void initC(int n) { if(iv.empty())fac=ifac=iv=vector<modint>(2,1); int m=iv.size(); ++n; if(m>=n)return; iv.resize(n),fac.resize(n),ifac.resize(n); For(i,m,n-1){ iv[i]=iv[mod%i]*(mod-mod/i); fac[i]=fac[i-1]*i,ifac[i]=ifac[i-1]*iv[i]; } } inline modint C(int n,int m){ if(m<0||n<m)return 0; return initC(n),fac[n]*ifac[m]*ifac[n-m]; } inline modint sign(int n){return (n&1)?(mod-1):(1);} #define fi first #define se second #define pb push_back #define mkp make_pair typedef pair<int,int>pii; typedef vector<int>vi; #define maxn 505 #define inf 0x3f3f3f3f int n,dis[maxn][maxn]; char s[maxn]; int c[maxn][maxn],all; int mx[maxn][maxn],p[maxn][maxn]; void sub(int u,int v){ if(u>v)swap(u,v); if(c[u][v])c[u][v]=0,--all; } int ps[maxn],qs[maxn][maxn]; void work(int up){ // cout<<"work "<<up<<endl; For(i,1,n){ int *p=::p[i]; while(dis[i][p[ps[i]]]>up){ int u=p[ps[i]]; For(j,1,n) mx[i][j]=max(mx[i][j],dis[p[j]][u]); --ps[i]; } if(ps[i]==n) continue; For(j,1,n){ int v=p[j]; while(qs[i][j]>=1){ int u=p[qs[i][j]]; if(dis[i][u]+mx[i][j]<=up) break; // cout<<"sub "<<i<<" "<<u<<" "<<v<<endl; sub(u,v); --qs[i][j]; } // dis(i,u) + mx[v] > up: baodiao u } } // For(i,1,n){ // For(j,i+1,n) cout<<c[i][j]<<" "; cout<<"\n"; // } } void work() { n=read(); For(i,1,n){ scanf("%s",s+1); For(j,1,n)dis[i][j]=(s[j]&1)?1:inf; dis[i][i]=0; } For(k,1,n)For(i,1,n)For(j,1,n)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); all=0; For(i,1,n)For(j,i+1,n)c[i][j]=n,++all; For(i,1,n){ For(j,1,n)p[i][j]=j; sort(p[i]+1,p[i]+n+1,[&](int u,int v){ return dis[i][u]<dis[i][v]; }); ps[i]=n; For(j,1,n) qs[i][j]=j-1,mx[i][j]=-inf; } Rep(i,n-1,1){ work(i); if(!all){ cout<<i+1<<endl; return; } } cout<<1<<endl; } signed main() { int T=read(); while(T--)work(); return 0; } /* 2 4 0111 1011 1101 1110 5 01000 10100 01010 00101 00010 */ |
English