#include <bits/stdc++.h>
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
#define ll long long
#define dbg(x) cerr << #x << ": " << x << "\n"
#define mp make_pair
using namespace std;
const int N = 405;
const int inf = 1e9;
vector<int> e[N];
vector<pair<int, int>> tab[N];
int dis[N][N];
string input[N];
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> input[i];
e[i].clear();
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (input[i][j - 1] == '1')
e[i].pb(j);
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
dis[i][j] = inf;
queue<int> Q;
Q.push(i);
dis[i][i] = 0;
while (!Q.empty())
{
int u = Q.front();
Q.pop();
for (int v : e[u])
{
if (dis[i][v] == inf)
{
Q.push(v);
dis[i][v] = dis[i][u] + 1;
tab[i].pb({dis[i][v], v});
}
}
}
sort(tab[i].begin(), tab[i].end());
reverse(tab[i].begin(), tab[i].end());
}
int res = inf;
for (int tel_i = 1; tel_i <= n; tel_i++)
{
// cout << tel_i << "\n";
for (int tel_j = tel_i + 1; tel_j <= n; tel_j++)
{
int tel_res = 0;
for (int i = 1; i <= n; i++)
{
for (auto [len, j] : tab[i])
{
if (j <= i)
continue;
int mini = min(dis[i][tel_i] + dis[tel_j][j], dis[i][tel_j] + dis[tel_i][j]);
tel_res = max(tel_res, min(dis[i][j], mini));
if (dis[i][j] <= mini)
break;
}
}
// cout << tel_j << " " << tel_res << "\n";
res = min(res, tel_res);
}
}
cout << res << "\n";
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
int t;
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 104 105 | #include <bits/stdc++.h> #include <bits/stdc++.h> #define pb push_back #define f first #define s second #define ll long long #define dbg(x) cerr << #x << ": " << x << "\n" #define mp make_pair using namespace std; const int N = 405; const int inf = 1e9; vector<int> e[N]; vector<pair<int, int>> tab[N]; int dis[N][N]; string input[N]; void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> input[i]; e[i].clear(); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (input[i][j - 1] == '1') e[i].pb(j); } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) dis[i][j] = inf; queue<int> Q; Q.push(i); dis[i][i] = 0; while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int v : e[u]) { if (dis[i][v] == inf) { Q.push(v); dis[i][v] = dis[i][u] + 1; tab[i].pb({dis[i][v], v}); } } } sort(tab[i].begin(), tab[i].end()); reverse(tab[i].begin(), tab[i].end()); } int res = inf; for (int tel_i = 1; tel_i <= n; tel_i++) { // cout << tel_i << "\n"; for (int tel_j = tel_i + 1; tel_j <= n; tel_j++) { int tel_res = 0; for (int i = 1; i <= n; i++) { for (auto [len, j] : tab[i]) { if (j <= i) continue; int mini = min(dis[i][tel_i] + dis[tel_j][j], dis[i][tel_j] + dis[tel_i][j]); tel_res = max(tel_res, min(dis[i][j], mini)); if (dis[i][j] <= mini) break; } } // cout << tel_j << " " << tel_res << "\n"; res = min(res, tel_res); } } cout << res << "\n"; } int main() { cin.tie(0)->sync_with_stdio(0); int t; cin >> t; while (t--) solve(); return 0; } |
English