#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 407;
int dis[N][N];
int d2[N][N][N];
vector<pair<int, pair<int, int>>> dv;
void Solve()
{
int n; string s;
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> s;
for(int j = 1; j <= n; ++j)
if(s[j - 1] == '1' || i == j)
dis[i][j] = 1;
else
dis[i][j] = N * 2;
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
for(int k = 1; k <= n; ++k)
dis[j][k] = min(dis[j][k], dis[i][j] + dis[i][k]);
dv.clear();
for(int i = 1; i <= n; ++i)
for(int j = i + 1; j <= n; ++j)
dv.pb(make_pair(dis[i][j], make_pair(i, j)));
sort(dv.begin(), dv.end());
reverse(dv.begin(), dv.end());
for(int i = 1; i <= n; ++i)
for(int j = i + 1; j <= n; ++j)
for(int k = 1; k <= n; ++k)
d2[i][j][k] = min(dis[i][k], dis[j][k]);
int ans = N;
for(int i = 1; i <= n; ++i)
for(int j = i + 1; j <= n; ++j)
{
int l = 0, cur = 0;
while(l < (int)dv.size() && cur < dv[l].st)
{
cur = max(cur, min(dv[l].st, d2[i][j][dv[l].nd.st] + d2[i][j][dv[l].nd.nd]));
++l;
}
ans = min(ans, cur);
}
cout << ans << "\n";
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
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 | #include <bits/stdc++.h> using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; const ll I = 1000'000'000'000'000'000LL; const int II = 2'000'000'000; const ll M = 1000'000'007LL; const int N = 407; int dis[N][N]; int d2[N][N][N]; vector<pair<int, pair<int, int>>> dv; void Solve() { int n; string s; cin >> n; for(int i = 1; i <= n; ++i) { cin >> s; for(int j = 1; j <= n; ++j) if(s[j - 1] == '1' || i == j) dis[i][j] = 1; else dis[i][j] = N * 2; } for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) for(int k = 1; k <= n; ++k) dis[j][k] = min(dis[j][k], dis[i][j] + dis[i][k]); dv.clear(); for(int i = 1; i <= n; ++i) for(int j = i + 1; j <= n; ++j) dv.pb(make_pair(dis[i][j], make_pair(i, j))); sort(dv.begin(), dv.end()); reverse(dv.begin(), dv.end()); for(int i = 1; i <= n; ++i) for(int j = i + 1; j <= n; ++j) for(int k = 1; k <= n; ++k) d2[i][j][k] = min(dis[i][k], dis[j][k]); int ans = N; for(int i = 1; i <= n; ++i) for(int j = i + 1; j <= n; ++j) { int l = 0, cur = 0; while(l < (int)dv.size() && cur < dv[l].st) { cur = max(cur, min(dv[l].st, d2[i][j][dv[l].nd.st] + d2[i][j][dv[l].nd.nd])); ++l; } ans = min(ans, cur); } cout << ans << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while(t--) Solve(); return 0; } |
English