#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxN=400;
int t, n;
char g[maxN+1][maxN+1];
vector<int>adj[maxN];
int dist[maxN][maxN]{0};
vector<pair<int, int>>sortedDist[maxN];
void init(){
for(int i=0; i<n; i++){
adj[i].clear();
sortedDist[i].clear();
for(int j=0; j<n; j++)dist[i][j]=0;
}
}
void bfs(int crr){
bool visited[n]{false};
visited[crr]=true;
queue<int>q, q2;
q.push(crr);
while(!q.empty()){
while(!q.empty()){
int it=q.front();
for(int j : adj[it])if(!visited[j]){
visited[j]=true;
dist[crr][j] = dist[crr][it]+1;
q2.push(j);
}
q.pop();
}
swap(q, q2);
}
}
void sortedDistInit(){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
sortedDist[i].push_back({dist[i][j], j});
}
sort(sortedDist[i].begin(), sortedDist[i].end());
reverse(sortedDist[i].begin(), sortedDist[i].end());
}
}
int getResult(int v, int l, int r){
int maxLen=0;
for(pair<int, int>p : sortedDist[v]){
if(maxLen >= p.first)return maxLen;
int newLen = dist[v][l] + dist[p.second][r];
newLen = min(newLen, dist[v][r] + dist[p.second][l]);
maxLen = max(maxLen, min(p.first, newLen));
}
}
int f(){
int result=0;
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
result = max(result, dist[i][j]);
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++)if(i != j){
int res2=0;
for(int v=0; v<n; v++){
res2 = max(getResult(v, i, j), res2);
//cout<<i+1<<' '<<j+1<<' '<<v+1<<" : "<<getResult(v, i, j)<<endl;
}
result = min(result, res2);
}
}
return result;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>t;
for(int i=0; i<t; i++){
cin>>n;
for(int j=0; j<n; j++){
cin>>g[j];
for(int k=j+1; k<n; k++){
if(g[j][k] == '1'){
adj[j].push_back(k);
adj[k].push_back(j);
}
}
}
for(int j=0; j<n; j++){
bfs(j);
//for(int k=0; k<n; k++)cout<<dist[j][k]<<' ';
//cout<<endl;
}
sortedDistInit();
/*for(int j=0; j<n; j++){
for(pair<int, int>p : sortedDist[j])cout<<p.first<<' '<<p.second<<" : ";
cout<<endl;
}
//*/
cout<<f()<<'\n';
init();
}
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxN=400; int t, n; char g[maxN+1][maxN+1]; vector<int>adj[maxN]; int dist[maxN][maxN]{0}; vector<pair<int, int>>sortedDist[maxN]; void init(){ for(int i=0; i<n; i++){ adj[i].clear(); sortedDist[i].clear(); for(int j=0; j<n; j++)dist[i][j]=0; } } void bfs(int crr){ bool visited[n]{false}; visited[crr]=true; queue<int>q, q2; q.push(crr); while(!q.empty()){ while(!q.empty()){ int it=q.front(); for(int j : adj[it])if(!visited[j]){ visited[j]=true; dist[crr][j] = dist[crr][it]+1; q2.push(j); } q.pop(); } swap(q, q2); } } void sortedDistInit(){ for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ sortedDist[i].push_back({dist[i][j], j}); } sort(sortedDist[i].begin(), sortedDist[i].end()); reverse(sortedDist[i].begin(), sortedDist[i].end()); } } int getResult(int v, int l, int r){ int maxLen=0; for(pair<int, int>p : sortedDist[v]){ if(maxLen >= p.first)return maxLen; int newLen = dist[v][l] + dist[p.second][r]; newLen = min(newLen, dist[v][r] + dist[p.second][l]); maxLen = max(maxLen, min(p.first, newLen)); } } int f(){ int result=0; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ result = max(result, dist[i][j]); } } for(int i=0; i<n; i++){ for(int j=0; j<n; j++)if(i != j){ int res2=0; for(int v=0; v<n; v++){ res2 = max(getResult(v, i, j), res2); //cout<<i+1<<' '<<j+1<<' '<<v+1<<" : "<<getResult(v, i, j)<<endl; } result = min(result, res2); } } return result; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>t; for(int i=0; i<t; i++){ cin>>n; for(int j=0; j<n; j++){ cin>>g[j]; for(int k=j+1; k<n; k++){ if(g[j][k] == '1'){ adj[j].push_back(k); adj[k].push_back(j); } } } for(int j=0; j<n; j++){ bfs(j); //for(int k=0; k<n; k++)cout<<dist[j][k]<<' '; //cout<<endl; } sortedDistInit(); /*for(int j=0; j<n; j++){ for(pair<int, int>p : sortedDist[j])cout<<p.first<<' '<<p.second<<" : "; cout<<endl; } //*/ cout<<f()<<'\n'; init(); } return 0; } |
English