#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll int
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000009
#define INF 1000000019
#define INFL 1000000000000000099LL
bool czyok[407][407],czyok2[407][407][407];
ll dodod[407][407],dous[407][407];
vector<pair<ll,ll>>pos[407];
void solve(){
ll n;
cin>>n;
char ch;
ll dst[n+7][n+7];
ll mxdst[n+7][n+7];
for(ll i=0;i<n+7;i++){
for(ll j=0;j<n+7;j++){
czyok[i][j]=1;
mxdst[i][j]=0;
for(ll pom=0;pom<n+7;pom++)czyok2[i][j][pom]=1;
}
}
vector<ll>sas[n+7];
// cin>>n;
for(ll i=0;i<n;i++){
for(ll j=0;j<n;j++){
cin>>ch;
if(ch=='1')sas[i].pb(j);
}
}
for(ll i=0; i<n; i++)
for(ll j=0; j<n; j++)
dst[i][j] = ((i != j) *INF);
for(ll i=0; i<n; i++)
for(ll j : sas[i])
dst[i][j] = 1;
for(ll k=0; k<n; k++)
for(ll i=0; i<n; i++)
for(ll j=0; j<n; j++)
dst[i][j] = min(dst[i][j], dst[i][k] + dst[k][j]);
for(ll t=0;t<n;t++){
pos[t].clear();
for(ll i=0;i<n;i++){
pos[t].pb({dst[t][i],i});
dodod[t][i]=n-1;
dous[t][i]=n-1;
}
sort(pos[t].begin(),pos[t].end());
}
for(ll t=n;t>=0;t--){//pożądany rozmiar
for(ll i=0;i<n;i++){//wierzchołek, który ma akceptować pary
for(ll j=0;j<n;j++){//ten wierzchołek z pary, który jest dalej od $i
while(dodod[i][j]>=0 && pos[i][dodod[i][j]].ff>t){
mxdst[i][j]=max(mxdst[i][j],dst[j][pos[i][dodod[i][j]].ss]);
dodod[i][j]--;
}
ll ocz=t-mxdst[i][j];
while(dous[i][j]>=0 && ocz<pos[i][dous[i][j]].ff){
czyok2[i][j][pos[i][dous[i][j]].ss]=0;
if(czyok2[i][pos[i][dous[i][j]].ss][j]==0){
czyok[j][pos[i][dous[i][j]].ss]=0;
czyok[pos[i][dous[i][j]].ss][j]=0;
}
dous[i][j]--;
}
}
}
ll bl=0;
for(ll i=0;i<n;i++){
for(ll j=0;j<n;j++){
if(czyok[i][j])
bl=1;
}
}
if(!bl){
cout<<t+1<<"\n";
return;
}
}
cout<<"0\n";
}
ll T;
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>T;
while(T--){
solve();
}
return 0;
}
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 | #pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll int #define pb push_back #define ff first #define ss second #define MOD 1000000009 #define INF 1000000019 #define INFL 1000000000000000099LL bool czyok[407][407],czyok2[407][407][407]; ll dodod[407][407],dous[407][407]; vector<pair<ll,ll>>pos[407]; void solve(){ ll n; cin>>n; char ch; ll dst[n+7][n+7]; ll mxdst[n+7][n+7]; for(ll i=0;i<n+7;i++){ for(ll j=0;j<n+7;j++){ czyok[i][j]=1; mxdst[i][j]=0; for(ll pom=0;pom<n+7;pom++)czyok2[i][j][pom]=1; } } vector<ll>sas[n+7]; // cin>>n; for(ll i=0;i<n;i++){ for(ll j=0;j<n;j++){ cin>>ch; if(ch=='1')sas[i].pb(j); } } for(ll i=0; i<n; i++) for(ll j=0; j<n; j++) dst[i][j] = ((i != j) *INF); for(ll i=0; i<n; i++) for(ll j : sas[i]) dst[i][j] = 1; for(ll k=0; k<n; k++) for(ll i=0; i<n; i++) for(ll j=0; j<n; j++) dst[i][j] = min(dst[i][j], dst[i][k] + dst[k][j]); for(ll t=0;t<n;t++){ pos[t].clear(); for(ll i=0;i<n;i++){ pos[t].pb({dst[t][i],i}); dodod[t][i]=n-1; dous[t][i]=n-1; } sort(pos[t].begin(),pos[t].end()); } for(ll t=n;t>=0;t--){//pożądany rozmiar for(ll i=0;i<n;i++){//wierzchołek, który ma akceptować pary for(ll j=0;j<n;j++){//ten wierzchołek z pary, który jest dalej od $i while(dodod[i][j]>=0 && pos[i][dodod[i][j]].ff>t){ mxdst[i][j]=max(mxdst[i][j],dst[j][pos[i][dodod[i][j]].ss]); dodod[i][j]--; } ll ocz=t-mxdst[i][j]; while(dous[i][j]>=0 && ocz<pos[i][dous[i][j]].ff){ czyok2[i][j][pos[i][dous[i][j]].ss]=0; if(czyok2[i][pos[i][dous[i][j]].ss][j]==0){ czyok[j][pos[i][dous[i][j]].ss]=0; czyok[pos[i][dous[i][j]].ss][j]=0; } dous[i][j]--; } } } ll bl=0; for(ll i=0;i<n;i++){ for(ll j=0;j<n;j++){ if(czyok[i][j]) bl=1; } } if(!bl){ cout<<t+1<<"\n"; return; } } cout<<"0\n"; } ll T; int main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>T; while(T--){ solve(); } return 0; } |
English