#include <bits/stdc++.h> using namespace std; vector<vector<int>> licz_odleglosci(int wies, const vector<string>& sasiedzi) { vector<vector<int>> dystans(wies, vector<int>(wies, -1)); for (int bocian = 0; bocian < wies; ++bocian) { queue<int> kolejka; kolejka.push(bocian); dystans[bocian][bocian] = 0; while (!kolejka.empty()) { int krowa = kolejka.front(); kolejka.pop(); for (int kon = 0; kon < wies; ++kon) { if (sasiedzi[krowa][kon] == '1' && dystans[bocian][kon] == -1) { dystans[bocian][kon] = dystans[bocian][krowa] + 1; kolejka.push(kon); } } } } return dystans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int buraki; cin >> buraki; while (buraki--) { int wies; cin >> wies; vector<string> sasiedzi(wies); for (int klusek = 0; klusek < wies; ++klusek) { cin >> sasiedzi[klusek]; } auto dystans = licz_odleglosci(wies, sasiedzi); int pierwotna_szerokosc = 0; for (int baca = 0; baca < wies; ++baca) { for (int gazda = 0; gazda < wies; ++gazda) { pierwotna_szerokosc = max(pierwotna_szerokosc, dystans[baca][gazda]); } } int najlepszy = pierwotna_szerokosc; for (int kurnik = 0; kurnik < wies; ++kurnik) { for (int obora = kurnik + 1; obora < wies; ++obora) { int obecne_maksimum = 0; for (int owca = 0; owca < wies; ++owca) { for (int swinia = 0; swinia < wies; ++swinia) { int droga1 = dystans[owca][swinia]; int droga2 = dystans[owca][kurnik] + dystans[obora][swinia]; int droga3 = dystans[owca][obora] + dystans[kurnik][swinia]; int aktualna_droga = min({droga1, droga2, droga3}); obecne_maksimum = max(obecne_maksimum, aktualna_droga); if (obecne_maksimum >= najlepszy) { owca = wies; swinia = wies; } } } if (obecne_maksimum < najlepszy) { najlepszy = obecne_maksimum; } } } cout << najlepszy << '\n'; } 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; vector<vector<int>> licz_odleglosci(int wies, const vector<string>& sasiedzi) { vector<vector<int>> dystans(wies, vector<int>(wies, -1)); for (int bocian = 0; bocian < wies; ++bocian) { queue<int> kolejka; kolejka.push(bocian); dystans[bocian][bocian] = 0; while (!kolejka.empty()) { int krowa = kolejka.front(); kolejka.pop(); for (int kon = 0; kon < wies; ++kon) { if (sasiedzi[krowa][kon] == '1' && dystans[bocian][kon] == -1) { dystans[bocian][kon] = dystans[bocian][krowa] + 1; kolejka.push(kon); } } } } return dystans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int buraki; cin >> buraki; while (buraki--) { int wies; cin >> wies; vector<string> sasiedzi(wies); for (int klusek = 0; klusek < wies; ++klusek) { cin >> sasiedzi[klusek]; } auto dystans = licz_odleglosci(wies, sasiedzi); int pierwotna_szerokosc = 0; for (int baca = 0; baca < wies; ++baca) { for (int gazda = 0; gazda < wies; ++gazda) { pierwotna_szerokosc = max(pierwotna_szerokosc, dystans[baca][gazda]); } } int najlepszy = pierwotna_szerokosc; for (int kurnik = 0; kurnik < wies; ++kurnik) { for (int obora = kurnik + 1; obora < wies; ++obora) { int obecne_maksimum = 0; for (int owca = 0; owca < wies; ++owca) { for (int swinia = 0; swinia < wies; ++swinia) { int droga1 = dystans[owca][swinia]; int droga2 = dystans[owca][kurnik] + dystans[obora][swinia]; int droga3 = dystans[owca][obora] + dystans[kurnik][swinia]; int aktualna_droga = min({droga1, droga2, droga3}); obecne_maksimum = max(obecne_maksimum, aktualna_droga); if (obecne_maksimum >= najlepszy) { owca = wies; swinia = wies; } } } if (obecne_maksimum < najlepszy) { najlepszy = obecne_maksimum; } } } cout << najlepszy << '\n'; } return 0; } |