#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using pi = pair<int, int>;
#define all(x) x.begin(), x.end()
#define INF 1000000
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vvi dist(n, vi(n, 0));
for (int i = 0; i < n; i++)
{
string s;
cin >> s;
for (int j = 0; j < n; j++)
{
if (i == j)
continue;
dist[i][j] = s[j] == '1' ? 1 : INF;
}
}
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
vector<pi> pair_nodes;
pair_nodes.reserve(n * (n - 1) / 2);
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
pair_nodes.push_back({i, j});
}
}
sort(all(pair_nodes), [&](pi a, pi b)
{ return dist[a.first][a.second] > dist[b.first][b.second]; });
int min_diam = INF;
for (auto [v, u] : pair_nodes)
{
int diam = 0;
for (auto [a, b] : pair_nodes)
{
if (dist[a][b] <= diam)
break;
int new_dist = min({dist[a][b],
dist[a][v] + dist[u][b],
dist[a][u] + dist[v][b]});
diam = max(diam, new_dist);
if (diam >= min_diam)
break;
}
min_diam = min(min_diam, diam);
}
cout << min_diam << '\n';
}
}
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 | #include <bits/stdc++.h> using namespace std; using vi = vector<int>; using vvi = vector<vi>; using pi = pair<int, int>; #define all(x) x.begin(), x.end() #define INF 1000000 int main() { int t; cin >> t; while (t--) { int n; cin >> n; vvi dist(n, vi(n, 0)); for (int i = 0; i < n; i++) { string s; cin >> s; for (int j = 0; j < n; j++) { if (i == j) continue; dist[i][j] = s[j] == '1' ? 1 : INF; } } for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } vector<pi> pair_nodes; pair_nodes.reserve(n * (n - 1) / 2); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { pair_nodes.push_back({i, j}); } } sort(all(pair_nodes), [&](pi a, pi b) { return dist[a.first][a.second] > dist[b.first][b.second]; }); int min_diam = INF; for (auto [v, u] : pair_nodes) { int diam = 0; for (auto [a, b] : pair_nodes) { if (dist[a][b] <= diam) break; int new_dist = min({dist[a][b], dist[a][v] + dist[u][b], dist[a][u] + dist[v][b]}); diam = max(diam, new_dist); if (diam >= min_diam) break; } min_diam = min(min_diam, diam); } cout << min_diam << '\n'; } } |
English