#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for (int i = (a); i <= (b); ++i)
#define REPD(i,a,b) for (int i = (a); i >= (b); --i)
#define FORI(i,n) REP(i,1,n)
#define FOR(i,n) REP(i,0,int(n)-1)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define ll long long
#define SZ(x) int((x).size())
#define DBG(v) cerr << #v << " = " << (v) << endl;
#define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++)
#define fi first
#define se second
const int inf = 1000100100;
const int N = 404;
struct dst {
int d,i,j;
dst(int d_, int i_, int j_) : d(d_), i(i_), j(j_) {}
dst() : d(0), i(0), j(0) {}
bool operator< (dst x) const {
if (d != x.d) return d > x.d;
if (i != x.i) return i < x.i;
return j < x.j;
}
};
int n;
int d[N][N];
char s[N][N];
dst t[N*N];
void test() {
scanf("%d", &n);
FOR(i,n) {
scanf(" %s", s[i]);
FOR(j,n) {
d[i][j] = inf;
if (s[i][j] == '1') d[i][j] = 1;
}
d[i][i] = 0;
}
FOR(k,n) {
FOR(i,n) FOR(j,n) if (d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j];
}
int nn = 0;
FOR(i,n) FOR(j,i) t[nn++] = dst(d[i][j],i,j);
sort(t,t+nn);
int res = t[0].d;
FOR(a,n) FOR(b,a) {
int worst_d = 0;
FOR(k,nn) {
if (t[k].d <= worst_d) break;
int cur_d = t[k].d;
cur_d = min(cur_d, d[t[k].i][a] + d[b][t[k].j]);
cur_d = min(cur_d, d[t[k].i][b] + d[a][t[k].j]);
worst_d = max(worst_d, cur_d);
}
res = min(res, worst_d);
}
printf("%d\n", res);
}
int main() {
int tt;
scanf("%d", &tt);
FOR(i,tt) test();
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 | #include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second const int inf = 1000100100; const int N = 404; struct dst { int d,i,j; dst(int d_, int i_, int j_) : d(d_), i(i_), j(j_) {} dst() : d(0), i(0), j(0) {} bool operator< (dst x) const { if (d != x.d) return d > x.d; if (i != x.i) return i < x.i; return j < x.j; } }; int n; int d[N][N]; char s[N][N]; dst t[N*N]; void test() { scanf("%d", &n); FOR(i,n) { scanf(" %s", s[i]); FOR(j,n) { d[i][j] = inf; if (s[i][j] == '1') d[i][j] = 1; } d[i][i] = 0; } FOR(k,n) { FOR(i,n) FOR(j,n) if (d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j]; } int nn = 0; FOR(i,n) FOR(j,i) t[nn++] = dst(d[i][j],i,j); sort(t,t+nn); int res = t[0].d; FOR(a,n) FOR(b,a) { int worst_d = 0; FOR(k,nn) { if (t[k].d <= worst_d) break; int cur_d = t[k].d; cur_d = min(cur_d, d[t[k].i][a] + d[b][t[k].j]); cur_d = min(cur_d, d[t[k].i][b] + d[a][t[k].j]); worst_d = max(worst_d, cur_d); } res = min(res, worst_d); } printf("%d\n", res); } int main() { int tt; scanf("%d", &tt); FOR(i,tt) test(); return 0; } |
English