/* 2025
* Maciej Szeptuch
*/
#include <algorithm>
#include <cstdio>
int tests;
int verts;
char edges[512][512];
int dist[512][512];
int dist2[512][512];
int solve(void);
int diameter(int v1, int v2, int best);
int main(void)
{
scanf("%d", &tests);
for(int t = 0; t < tests; ++t)
{
scanf("%d", &verts);
for(int v = 0; v < verts; ++v)
scanf("%s", edges[v]);
printf("%d\n", solve());
}
return 0;
}
int solve(void)
{
for(int f = 0; f < verts; ++f)
for(int s = 0; s < verts; ++s)
if(f != s)
dist[f][s] = edges[f][s] == '1' ? 1 : 512;
for(int t = 0; t < verts; ++t)
for(int f = 0; f < verts; ++f)
for(int s = 0; s < verts; ++s)
if(dist[f][s] > dist[f][t] + dist[t][s])
dist[f][s] = dist[f][t] + dist[t][s];
int best = 512;
for(int f = 0; f < verts; ++f)
for(int s = f + 1; s < verts; ++s)
best = std::min(best, diameter(f, s, best));
return best;
}
int diameter(int v1, int v2, int best)
{
for(int f = 0; f < verts; ++f)
for(int s = 0; s < verts; ++s)
dist2[f][s] = dist[f][s];
for(int f = 0; f < verts; ++f)
for(int s = 0; s < verts; ++s)
{
if(dist2[f][s] > dist2[f][v1] + dist2[v1][s])
dist2[f][s] = dist2[f][v1] + dist2[v1][s];
if(dist2[f][s] > dist2[f][v2] + dist2[v2][s])
dist2[f][s] = dist2[f][v2] + dist2[v2][s];
if(dist2[f][s] > dist2[f][v1] + dist2[v2][s])
dist2[f][s] = dist2[f][v1] + dist2[v2][s];
if(dist2[f][s] > dist2[f][v2] + dist2[v1][s])
dist2[f][s] = dist2[f][v2] + dist2[v1][s];
if(best <= dist2[f][s])
return best;
}
int farthest = 0;
for(int f = 0; f < verts; ++f)
for(int s = f + 1; s < verts; ++s)
farthest = std::max(farthest, dist2[f][s]);
return farthest;
}
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 | /* 2025 * Maciej Szeptuch */ #include <algorithm> #include <cstdio> int tests; int verts; char edges[512][512]; int dist[512][512]; int dist2[512][512]; int solve(void); int diameter(int v1, int v2, int best); int main(void) { scanf("%d", &tests); for(int t = 0; t < tests; ++t) { scanf("%d", &verts); for(int v = 0; v < verts; ++v) scanf("%s", edges[v]); printf("%d\n", solve()); } return 0; } int solve(void) { for(int f = 0; f < verts; ++f) for(int s = 0; s < verts; ++s) if(f != s) dist[f][s] = edges[f][s] == '1' ? 1 : 512; for(int t = 0; t < verts; ++t) for(int f = 0; f < verts; ++f) for(int s = 0; s < verts; ++s) if(dist[f][s] > dist[f][t] + dist[t][s]) dist[f][s] = dist[f][t] + dist[t][s]; int best = 512; for(int f = 0; f < verts; ++f) for(int s = f + 1; s < verts; ++s) best = std::min(best, diameter(f, s, best)); return best; } int diameter(int v1, int v2, int best) { for(int f = 0; f < verts; ++f) for(int s = 0; s < verts; ++s) dist2[f][s] = dist[f][s]; for(int f = 0; f < verts; ++f) for(int s = 0; s < verts; ++s) { if(dist2[f][s] > dist2[f][v1] + dist2[v1][s]) dist2[f][s] = dist2[f][v1] + dist2[v1][s]; if(dist2[f][s] > dist2[f][v2] + dist2[v2][s]) dist2[f][s] = dist2[f][v2] + dist2[v2][s]; if(dist2[f][s] > dist2[f][v1] + dist2[v2][s]) dist2[f][s] = dist2[f][v1] + dist2[v2][s]; if(dist2[f][s] > dist2[f][v2] + dist2[v1][s]) dist2[f][s] = dist2[f][v2] + dist2[v1][s]; if(best <= dist2[f][s]) return best; } int farthest = 0; for(int f = 0; f < verts; ++f) for(int s = f + 1; s < verts; ++s) farthest = std::max(farthest, dist2[f][s]); return farthest; } |
English