#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
int results[30];
int dists[407][407];
void bfs(int u, int n, std::vector<std::vector<int>>& v)
{
std::vector<bool> visited(n, false);
std::queue<int> q;
for(int i=0; i<n; i++)
{
dists[u][i]=n+1;
}
dists[u][u]=0;
q.push(u);
while(!q.empty())
{
int w = q.front();
q.pop();
if(visited[w]) continue;
visited[w]=true;
for(int i=0; i<v[w].size(); i++)
{
q.push(v[w][i]);
dists[u][v[w][i]] = std::min(dists[u][v[w][i]], dists[u][w]+1);
}
}
}
int main()
{
int t,n;
char c;
scanf("%d", &t);
for(int h=0; h<t; h++)
{
scanf("%d\n", &n);
std::vector<std::vector<int>> v(n);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%c", &c);
if(c=='1')
{
v[i].push_back(j);
}
}
scanf("%c", &c);
}
for(int i=0; i<n; i++)
{
bfs(i, n, v);
}
int globalMaxDist = n+1;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
int localMaxDist = 0;
for(int k=0; k<n; k++)
{
for(int l=k+1; l<n; l++)
{
int distance1 = dists[j][k] + dists[i][l];
int distance2 = dists[j][l] + dists[i][k];
int distance3= dists[k][l];
int optDist = std::min(distance1, std::min(distance2, distance3));
if(optDist > localMaxDist)
{
localMaxDist = optDist;
if(localMaxDist >= globalMaxDist) break;
}
}
if(localMaxDist >= globalMaxDist) break;
}
globalMaxDist = std::min(localMaxDist, globalMaxDist);
}
}
results[h] = globalMaxDist;
}
for(int h=0; h<t; h++)
{
printf("%d\n", results[h]);
}
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 | #include <cstdio> #include <vector> #include <queue> #include <algorithm> int results[30]; int dists[407][407]; void bfs(int u, int n, std::vector<std::vector<int>>& v) { std::vector<bool> visited(n, false); std::queue<int> q; for(int i=0; i<n; i++) { dists[u][i]=n+1; } dists[u][u]=0; q.push(u); while(!q.empty()) { int w = q.front(); q.pop(); if(visited[w]) continue; visited[w]=true; for(int i=0; i<v[w].size(); i++) { q.push(v[w][i]); dists[u][v[w][i]] = std::min(dists[u][v[w][i]], dists[u][w]+1); } } } int main() { int t,n; char c; scanf("%d", &t); for(int h=0; h<t; h++) { scanf("%d\n", &n); std::vector<std::vector<int>> v(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%c", &c); if(c=='1') { v[i].push_back(j); } } scanf("%c", &c); } for(int i=0; i<n; i++) { bfs(i, n, v); } int globalMaxDist = n+1; for(int i=0; i<n; i++) { for(int j=i+1; j<n; j++) { int localMaxDist = 0; for(int k=0; k<n; k++) { for(int l=k+1; l<n; l++) { int distance1 = dists[j][k] + dists[i][l]; int distance2 = dists[j][l] + dists[i][k]; int distance3= dists[k][l]; int optDist = std::min(distance1, std::min(distance2, distance3)); if(optDist > localMaxDist) { localMaxDist = optDist; if(localMaxDist >= globalMaxDist) break; } } if(localMaxDist >= globalMaxDist) break; } globalMaxDist = std::min(localMaxDist, globalMaxDist); } } results[h] = globalMaxDist; } for(int h=0; h<t; h++) { printf("%d\n", results[h]); } return 0; } |
English