#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int compute_diameter(int n, const vector<vector<int>> &dist) {
int diameter = 0;
for(int x = 0; x < n; x++) {
for(int y = 0; y < n; y++) {
if(dist[x][y] < INF) {
diameter = max(diameter, dist[x][y]);
}
}
}
return diameter;
}
void solve() {
int n; cin >> n;
vector<vector<int>> dist(n, vector<int>(n, INF));
for(int x=0;x<n;x++) {
for(int y=0;y<n;y++) {
char c; cin >> c;
if(x == y)
dist[x][y] = 0;
else if(c == '1')
dist[x][y] = 1;
}
}
for(int k=0;k<n;k++){
for(int x=0;x<n;x++){
for(int y=0;y<n;y++){
dist[x][y] = min(dist[x][y], dist[x][k]+dist[k][y]);
}
}
}
int initial_diameter = compute_diameter(n, dist);
int min_diameter = initial_diameter;
for(int u=0;u<n;u++){
for(int v=u+1;v<n;v++){
if(dist[u][v] == INF) continue;
vector<vector<int>> new_dist = dist;
for(int x = 0; x < n; x++){
for(int y = 0; y < n; y++) {
new_dist[x][y] = min(new_dist[x][y], min(
dist[x][u] + 1 + dist[v][y],
dist[x][v] + 1 + dist[u][y]
));
}
}
int new_diameter = compute_diameter(n, new_dist);
min_diameter = min(min_diameter, new_diameter);
}
}
cout << min_diameter << "\n";
}
int main() {
ios_base::sync_with_stdio(0);cin.tie();
int t; cin >> t;
while(t--) {
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 | #include <bits/stdc++.h> using namespace std; const int INF = 1e9; int compute_diameter(int n, const vector<vector<int>> &dist) { int diameter = 0; for(int x = 0; x < n; x++) { for(int y = 0; y < n; y++) { if(dist[x][y] < INF) { diameter = max(diameter, dist[x][y]); } } } return diameter; } void solve() { int n; cin >> n; vector<vector<int>> dist(n, vector<int>(n, INF)); for(int x=0;x<n;x++) { for(int y=0;y<n;y++) { char c; cin >> c; if(x == y) dist[x][y] = 0; else if(c == '1') dist[x][y] = 1; } } for(int k=0;k<n;k++){ for(int x=0;x<n;x++){ for(int y=0;y<n;y++){ dist[x][y] = min(dist[x][y], dist[x][k]+dist[k][y]); } } } int initial_diameter = compute_diameter(n, dist); int min_diameter = initial_diameter; for(int u=0;u<n;u++){ for(int v=u+1;v<n;v++){ if(dist[u][v] == INF) continue; vector<vector<int>> new_dist = dist; for(int x = 0; x < n; x++){ for(int y = 0; y < n; y++) { new_dist[x][y] = min(new_dist[x][y], min( dist[x][u] + 1 + dist[v][y], dist[x][v] + 1 + dist[u][y] )); } } int new_diameter = compute_diameter(n, new_dist); min_diameter = min(min_diameter, new_diameter); } } cout << min_diameter << "\n"; } int main() { ios_base::sync_with_stdio(0);cin.tie(); int t; cin >> t; while(t--) { solve(); } } |
English