#include<bits/stdc++.h>
using namespace std;
map<pair<int, int>, int> mapa;
pair<int, int> bfs(int w, int n, vector<int> graf[]){
vector<int> odl(n + 1, INT_MAX);
deque<int> q;
odl[w] = 0;
q.push_back(w);
while(!q.empty()){
w = q.front();
q.pop_front();
for(auto u : graf[w]){
int waga;
if(mapa[{u, w}] == 1) waga = 1;
else waga = 0;
if(odl[w] + waga < odl[u]){
odl[u] = odl[w] + waga;
if(waga == 0) q.push_front(u);
else q.push_back(u);
}
}
}
int node = w;
int maks_odl = 0;
for(int i = 1; i <= n; i++){
if(odl[i] > maks_odl){
maks_odl = odl[i];
node = i;
}
}
return {maks_odl, node};
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int t;
cin >> t;
while(t--){
int n;
cin >> n;
int wynik = INT_MAX;
mapa.clear();
vector<int> graf[n + 1];
for(int i = 1; i <= n; i++){
string s;
cin >> s;
for(int j = 1; j <= n; j++){
if(s[j - 1] == '1'){
graf[i].push_back(j);
mapa[{i, j}] = 1;
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(i == j) continue;
if(mapa[{i, j}] == 0){
graf[i].push_back(j);
graf[j].push_back(i);
}
pair<int, int> pocz = bfs(1, n, graf);
wynik = min(wynik, bfs(pocz.second, n, graf).first);
if(mapa[{i, j}] == 0){
graf[i].pop_back();
graf[j].pop_back();
}
}
}
cout << wynik << '\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 | #include<bits/stdc++.h> using namespace std; map<pair<int, int>, int> mapa; pair<int, int> bfs(int w, int n, vector<int> graf[]){ vector<int> odl(n + 1, INT_MAX); deque<int> q; odl[w] = 0; q.push_back(w); while(!q.empty()){ w = q.front(); q.pop_front(); for(auto u : graf[w]){ int waga; if(mapa[{u, w}] == 1) waga = 1; else waga = 0; if(odl[w] + waga < odl[u]){ odl[u] = odl[w] + waga; if(waga == 0) q.push_front(u); else q.push_back(u); } } } int node = w; int maks_odl = 0; for(int i = 1; i <= n; i++){ if(odl[i] > maks_odl){ maks_odl = odl[i]; node = i; } } return {maks_odl, node}; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--){ int n; cin >> n; int wynik = INT_MAX; mapa.clear(); vector<int> graf[n + 1]; for(int i = 1; i <= n; i++){ string s; cin >> s; for(int j = 1; j <= n; j++){ if(s[j - 1] == '1'){ graf[i].push_back(j); mapa[{i, j}] = 1; } } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(i == j) continue; if(mapa[{i, j}] == 0){ graf[i].push_back(j); graf[j].push_back(i); } pair<int, int> pocz = bfs(1, n, graf); wynik = min(wynik, bfs(pocz.second, n, graf).first); if(mapa[{i, j}] == 0){ graf[i].pop_back(); graf[j].pop_back(); } } } cout << wynik << '\n'; } } |
English