#include <bits/stdc++.h>
using namespace std;
const int Base = 4 * 1e2 + 7;
int Pierdylion = 1e9 + 7;
basic_string<char32_t> graf[Base];
deque<pair<int, int>> q;
// priority_queue<pair<int, int>> q;
int odw[Base];
int t, n;
int X, Y;
int Max, Idx = 1, Min = Pierdylion;
int MX, MY;
int WczytajInta()
{
char c;
int wyn = 0;
while(1) {
c = getchar();
if(c == ' ' or c == '\n' or c == EOF) break;
wyn *= 10;
wyn += int(c - '0');
}
return wyn;
}
void BFS(int x)
{
odw[x] = 0;
q.push_back({0, x});
// q.push({0, x});
pair<int, int> gura;
while(!q.empty()) {
gura = q.front();
q.pop_front();
if(gura.first > odw[gura.second]) continue;
// gura = q.top();
// q.pop();
// if(gura.first * -1 > odw[gura.second]) continue;
if(gura.second == X) {
if(odw[Y] > odw[gura.second]) {
odw[Y] = odw[gura.second];
q.push_front({odw[Y], Y});
// q.push({-1 * odw[Y], Y});
}
} else if(gura.second == Y) {
if(odw[X] > odw[gura.second]) {
odw[X] = odw[gura.second];
q.push_front({odw[X], X});
// q.push({-1 * odw[X], X});
}
}
for(int i : graf[gura.second]) {
if(odw[i] > odw[gura.second] + 1) {
odw[i] = odw[gura.second] + 1;
q.push_back({odw[i], i});
// q.push({odw[i] * -1, i});
}
}
}
}
int main()
{
t = WczytajInta();
char c;
bool czy = 0;
for(int z = 0; z < t; z++) {
n = WczytajInta();
Min = Pierdylion;
for(int i = 1; i <= n; i++) graf[i].clear();
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
c = getchar();
if(i == j) continue;
if(c == '1') {
graf[i].push_back(j);
}
}
c = getchar();
}
for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++) {
X = i;
Y = j;
Max = 0; Idx = 1;
for(int k = 1; k <= n; k++) odw[k] = Pierdylion;
czy = 0;
BFS(1);
for(int k = 1; k <= n; k++) {
if(Max <= odw[k]) {
Max = odw[k];
Idx = k;
}
if(odw[i] == Pierdylion) {
czy = 1; break;
}
}
if(czy) continue;
for(int k = 1; k <= n; k++) odw[k] = Pierdylion;
BFS(Idx);
// cerr << i << " " << j << " " << Idx << "\n";
Max = 0; Idx = 1;
for(int k = 1; k <= n; k++) {
Max = max(Max, odw[k]);
}
if(Max < Min) {
Min = Max;
MX = X;
MY = Y;
}
// Min = min(Min, Max);
}
}
printf("%d\n", Min);
// cerr << (z + 1) << " : " << MX << " " << MY << "\n";
}
}
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 116 117 118 119 120 121 122 | #include <bits/stdc++.h> using namespace std; const int Base = 4 * 1e2 + 7; int Pierdylion = 1e9 + 7; basic_string<char32_t> graf[Base]; deque<pair<int, int>> q; // priority_queue<pair<int, int>> q; int odw[Base]; int t, n; int X, Y; int Max, Idx = 1, Min = Pierdylion; int MX, MY; int WczytajInta() { char c; int wyn = 0; while(1) { c = getchar(); if(c == ' ' or c == '\n' or c == EOF) break; wyn *= 10; wyn += int(c - '0'); } return wyn; } void BFS(int x) { odw[x] = 0; q.push_back({0, x}); // q.push({0, x}); pair<int, int> gura; while(!q.empty()) { gura = q.front(); q.pop_front(); if(gura.first > odw[gura.second]) continue; // gura = q.top(); // q.pop(); // if(gura.first * -1 > odw[gura.second]) continue; if(gura.second == X) { if(odw[Y] > odw[gura.second]) { odw[Y] = odw[gura.second]; q.push_front({odw[Y], Y}); // q.push({-1 * odw[Y], Y}); } } else if(gura.second == Y) { if(odw[X] > odw[gura.second]) { odw[X] = odw[gura.second]; q.push_front({odw[X], X}); // q.push({-1 * odw[X], X}); } } for(int i : graf[gura.second]) { if(odw[i] > odw[gura.second] + 1) { odw[i] = odw[gura.second] + 1; q.push_back({odw[i], i}); // q.push({odw[i] * -1, i}); } } } } int main() { t = WczytajInta(); char c; bool czy = 0; for(int z = 0; z < t; z++) { n = WczytajInta(); Min = Pierdylion; for(int i = 1; i <= n; i++) graf[i].clear(); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { c = getchar(); if(i == j) continue; if(c == '1') { graf[i].push_back(j); } } c = getchar(); } for(int i = 1; i <= n; i++) { for(int j = i + 1; j <= n; j++) { X = i; Y = j; Max = 0; Idx = 1; for(int k = 1; k <= n; k++) odw[k] = Pierdylion; czy = 0; BFS(1); for(int k = 1; k <= n; k++) { if(Max <= odw[k]) { Max = odw[k]; Idx = k; } if(odw[i] == Pierdylion) { czy = 1; break; } } if(czy) continue; for(int k = 1; k <= n; k++) odw[k] = Pierdylion; BFS(Idx); // cerr << i << " " << j << " " << Idx << "\n"; Max = 0; Idx = 1; for(int k = 1; k <= n; k++) { Max = max(Max, odw[k]); } if(Max < Min) { Min = Max; MX = X; MY = Y; } // Min = min(Min, Max); } } printf("%d\n", Min); // cerr << (z + 1) << " : " << MX << " " << MY << "\n"; } } |
English