#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
void doit() {
int n; scanf(" %d", &n);
char ss[402][402];
for (int i=0; i<n; ++i) {
scanf(" %s", ss[i]);
}
vector<int> si(n);
for (int i=0; i<n; ++i) si[i] = i;
random_shuffle(si.begin(), si.end());
char s[402][402];
for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) s[i][j] = ss[si[i]][si[j]];
int t[402][402];
for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) {
if (i==j) t[i][j] = 0;
else if (s[i][j] == '1') t[i][j] = 1;
else t[i][j] = 800;
}
for (int k=0; k<n; ++k) for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) t[i][j] = min(t[i][j], t[i][k] + t[k][j]);
int best = 800;
for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) {
int curr = 0;
for (int k=0; k<n; ++k) {
if (curr >= best) break;
for (int l=0; l<n; ++l) {
curr = max(curr, min(min(t[i][k] + t[j][l], t[j][k] + t[i][l]), t[k][l]));
}
}
best = min(best, curr);
}
printf("%d\n", best);
}
int main() {
int t; scanf(" %d", &t);
while (t--) doit();
}
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 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; void doit() { int n; scanf(" %d", &n); char ss[402][402]; for (int i=0; i<n; ++i) { scanf(" %s", ss[i]); } vector<int> si(n); for (int i=0; i<n; ++i) si[i] = i; random_shuffle(si.begin(), si.end()); char s[402][402]; for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) s[i][j] = ss[si[i]][si[j]]; int t[402][402]; for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) { if (i==j) t[i][j] = 0; else if (s[i][j] == '1') t[i][j] = 1; else t[i][j] = 800; } for (int k=0; k<n; ++k) for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) t[i][j] = min(t[i][j], t[i][k] + t[k][j]); int best = 800; for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) { int curr = 0; for (int k=0; k<n; ++k) { if (curr >= best) break; for (int l=0; l<n; ++l) { curr = max(curr, min(min(t[i][k] + t[j][l], t[j][k] + t[i][l]), t[k][l])); } } best = min(best, curr); } printf("%d\n", best); } int main() { int t; scanf(" %d", &t); while (t--) doit(); } |
English