#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; } |