#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(); } |
English