#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'; } } |