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();
	}
}