#include <bits/stdc++.h> using namespace std; #define st first #define nd second #define pb push_back #define all(x) (x).begin(), (x).end() #define BOOST ios_base::sync_with_stdio(0), cin.tie(0) typedef long long ll; typedef long double ld; typedef pair<int, int> ii; const int N = 405, inf = 1e9; int g[N][N]; int d[N][N]; int tmp[N][N]; int t[N][N][N]; vector<int> xd[N]; int n; void solve(){ cin >> n; for(int i=1; i<=n; i++){ string s; cin >> s; s = '#' + s; for(int j=1; j<=n; j++){ if(s[j] == '1'){ g[i][j] = 1; } else{ g[i][j] = 0; } } } // warshall for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ d[i][j] = inf; if(g[i][j]) d[i][j] = 1; for(int k=1; k<=n; k++) t[i][j][k] = 0; } d[i][i] = 0; } for(int k=1; k<=n; k++){ for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(d[i][k] + d[k][j] < d[i][j]){ d[i][j] = d[i][k] + d[k][j]; } } } } for(int i=1; i<=n; i++){ xd[i] = vector<int>(n); iota(all(xd[i]), 1); sort(all(xd[i]), [&](int a, int b){return d[i][a] < d[i][b];}); } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ int a = 0, b = n-1; for(int k=1; k<=n; k++){ // fuel buget while(b >= 0 && (d[i][xd[j][b]] <= k)) b--; while(a < n && (b == -1 || d[i][xd[i][a]] + d[j][xd[j][b]] <= k)){ tmp[xd[i][a]][j] = k; a++; } } } for(int j=1; j<=n; j++){ for(int k=1; k<=n; k++){ if(j == k) continue; int x = min(tmp[j][k], tmp[k][j]); t[x][j][k]++; } } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ for(int k=1; k<=n; k++){ if(j == k) continue; t[i][j][k] += t[i-1][j][k]; if(t[i][j][k] == n){ cout << i << "\n"; return; } } } } } int main(){ BOOST; int q; cin >> q; while(q--) 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 98 | #include <bits/stdc++.h> using namespace std; #define st first #define nd second #define pb push_back #define all(x) (x).begin(), (x).end() #define BOOST ios_base::sync_with_stdio(0), cin.tie(0) typedef long long ll; typedef long double ld; typedef pair<int, int> ii; const int N = 405, inf = 1e9; int g[N][N]; int d[N][N]; int tmp[N][N]; int t[N][N][N]; vector<int> xd[N]; int n; void solve(){ cin >> n; for(int i=1; i<=n; i++){ string s; cin >> s; s = '#' + s; for(int j=1; j<=n; j++){ if(s[j] == '1'){ g[i][j] = 1; } else{ g[i][j] = 0; } } } // warshall for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ d[i][j] = inf; if(g[i][j]) d[i][j] = 1; for(int k=1; k<=n; k++) t[i][j][k] = 0; } d[i][i] = 0; } for(int k=1; k<=n; k++){ for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(d[i][k] + d[k][j] < d[i][j]){ d[i][j] = d[i][k] + d[k][j]; } } } } for(int i=1; i<=n; i++){ xd[i] = vector<int>(n); iota(all(xd[i]), 1); sort(all(xd[i]), [&](int a, int b){return d[i][a] < d[i][b];}); } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ int a = 0, b = n-1; for(int k=1; k<=n; k++){ // fuel buget while(b >= 0 && (d[i][xd[j][b]] <= k)) b--; while(a < n && (b == -1 || d[i][xd[i][a]] + d[j][xd[j][b]] <= k)){ tmp[xd[i][a]][j] = k; a++; } } } for(int j=1; j<=n; j++){ for(int k=1; k<=n; k++){ if(j == k) continue; int x = min(tmp[j][k], tmp[k][j]); t[x][j][k]++; } } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ for(int k=1; k<=n; k++){ if(j == k) continue; t[i][j][k] += t[i-1][j][k]; if(t[i][j][k] == n){ cout << i << "\n"; return; } } } } } int main(){ BOOST; int q; cin >> q; while(q--) solve(); } |