#include <bits/stdc++.h> using namespace std; //#pragma GCC target ("avx2") //#pragma GCC target ("avx") //#pragma GCC target ("native") #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") typedef long long LL; int odl[400][400]; //int ans[400][400]; int n; void floyd() { for (int j = 0; j < n; j++) for (int i = 0; i < n; i++) for (int k = 0; k < n; k++) if (odl[i][k] > odl[i][j] + odl[j][k]) odl[i][k] = odl[i][j] + odl[j][k]; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt; cin>>tt; while(tt--) { cin>>n; for(int i=0; i<n; i++){ string s; cin>>s; for(int j=0; j<n; j++){ if(s[j]=='0'){ if(i != j){ odl[i][j]=1001; } else{ odl[i][j]=0; } }else{ odl[i][j]=1; } } } int res = 1001; floyd(); /*for(int k=1; k<=n; k++){ for(int l=k+1; l<=n; l++){ for(int i=1; i<=n; i++){ for(int j=i+1; j<=n; j++){ int y = odl[k][l]; if(y > odl[k][i] + odl[j][l]) y = odl[k][i] + odl[j][l]; if(y > odl[k][j] + odl[i][l]) y = odl[k][j] + odl[i][l]; ans[i][j] = max(ans[i][j], y); } } } } for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ if(ans[i][j]>0){ res = min(res, ans[i][j]); } } }*/ vector<tuple<int, int, int>> v; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ v.push_back({odl[i][j], i, j}); } } sort(v.begin(), v.end()); reverse(v.begin(), v.end()); for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ int x = 0; for(auto [a, k, l] : v){ if(a <= x)break; int y = a; int q1 = odl[k][i] + odl[j][l]; int q2 = odl[k][j] + odl[i][l]; if(y > q1) y = q1; if(y > q2) y = q2; if(y > x) x=y; } if(res > x) res = x; } } /*for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ int x = 0; for(int k=0; k<n; k++){ for(int l=k+1; l<n; l++){ int y = odl[k][l]; int q1 = odl[k][i] + odl[j][l]; int q2 = odl[k][j] + odl[i][l]; if(y > q1) y = q1; if(y > q2) y = q2; if(y > x) x=y; } } if(res > x) res = x; } }*/ cout<<res<<"\n"; } 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <bits/stdc++.h> using namespace std; //#pragma GCC target ("avx2") //#pragma GCC target ("avx") //#pragma GCC target ("native") #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") typedef long long LL; int odl[400][400]; //int ans[400][400]; int n; void floyd() { for (int j = 0; j < n; j++) for (int i = 0; i < n; i++) for (int k = 0; k < n; k++) if (odl[i][k] > odl[i][j] + odl[j][k]) odl[i][k] = odl[i][j] + odl[j][k]; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt; cin>>tt; while(tt--) { cin>>n; for(int i=0; i<n; i++){ string s; cin>>s; for(int j=0; j<n; j++){ if(s[j]=='0'){ if(i != j){ odl[i][j]=1001; } else{ odl[i][j]=0; } }else{ odl[i][j]=1; } } } int res = 1001; floyd(); /*for(int k=1; k<=n; k++){ for(int l=k+1; l<=n; l++){ for(int i=1; i<=n; i++){ for(int j=i+1; j<=n; j++){ int y = odl[k][l]; if(y > odl[k][i] + odl[j][l]) y = odl[k][i] + odl[j][l]; if(y > odl[k][j] + odl[i][l]) y = odl[k][j] + odl[i][l]; ans[i][j] = max(ans[i][j], y); } } } } for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ if(ans[i][j]>0){ res = min(res, ans[i][j]); } } }*/ vector<tuple<int, int, int>> v; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ v.push_back({odl[i][j], i, j}); } } sort(v.begin(), v.end()); reverse(v.begin(), v.end()); for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ int x = 0; for(auto [a, k, l] : v){ if(a <= x)break; int y = a; int q1 = odl[k][i] + odl[j][l]; int q2 = odl[k][j] + odl[i][l]; if(y > q1) y = q1; if(y > q2) y = q2; if(y > x) x=y; } if(res > x) res = x; } } /*for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ int x = 0; for(int k=0; k<n; k++){ for(int l=k+1; l<n; l++){ int y = odl[k][l]; int q1 = odl[k][i] + odl[j][l]; int q2 = odl[k][j] + odl[i][l]; if(y > q1) y = q1; if(y > q2) y = q2; if(y > x) x=y; } } if(res > x) res = x; } }*/ cout<<res<<"\n"; } return 0; } |