#include<bits/stdc++.h> using namespace std; const int inf = INT_MAX; struct G{ vector <pair<int, int>> pol; int odl = inf; }*wezel; void dijkstra(int start, int w) { int dystans, a, b; for(int i=0; i<w; i++){ wezel[i].odl = inf; } wezel[start].odl = 0; set <pair<int, int>> krawedzie; for(int i=0; i<wezel[start].pol.size();i++) krawedzie.insert({wezel[start].pol[i].second, wezel[start].pol[i].first}); while(!krawedzie.empty()) { dystans = krawedzie.begin()->first; b = krawedzie.begin()->second; wezel[b].odl = min(dystans, wezel[b].odl); krawedzie.erase(krawedzie.begin()); for(int i=0; i<wezel[b].pol.size(); i++) if(wezel[wezel[b].pol[i].first].odl == inf) krawedzie.insert(make_pair(wezel[b].pol[i].second + dystans, wezel[b].pol[i].first)); } } int main() { int t; cin>>t; for(int k=0; k<t; k++){ int w, waga = 1, maxi = 0, maxia, maxib; string s; cin>>w; wezel = new G[w+1]; for(int i=0; i<w; i++) { cin>>s; for(int j=0; j<w; j++){ if(s[j] == '1'){ wezel[i].pol.push_back(make_pair(j, waga)); } } } for(int i=0; i<w; i++){ dijkstra(i, w); for(int j=0; j<w; j++){ if(wezel[j].odl > maxi){ maxi = wezel[j].odl; maxia = i; maxib = j; } } } wezel[maxia].pol.push_back(make_pair(maxib, 0)); wezel[maxib].pol.push_back(make_pair(maxia, 0)); maxi = 0; for(int i=0; i<w; i++){ dijkstra(i, w); for(int j=0; j<w; j++){ if(wezel[j].odl > maxi){ maxi = wezel[j].odl; maxia = i; maxib = j; } } } cout<<maxi<<'\n'; delete [] wezel; } 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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include<bits/stdc++.h> using namespace std; const int inf = INT_MAX; struct G{ vector <pair<int, int>> pol; int odl = inf; }*wezel; void dijkstra(int start, int w) { int dystans, a, b; for(int i=0; i<w; i++){ wezel[i].odl = inf; } wezel[start].odl = 0; set <pair<int, int>> krawedzie; for(int i=0; i<wezel[start].pol.size();i++) krawedzie.insert({wezel[start].pol[i].second, wezel[start].pol[i].first}); while(!krawedzie.empty()) { dystans = krawedzie.begin()->first; b = krawedzie.begin()->second; wezel[b].odl = min(dystans, wezel[b].odl); krawedzie.erase(krawedzie.begin()); for(int i=0; i<wezel[b].pol.size(); i++) if(wezel[wezel[b].pol[i].first].odl == inf) krawedzie.insert(make_pair(wezel[b].pol[i].second + dystans, wezel[b].pol[i].first)); } } int main() { int t; cin>>t; for(int k=0; k<t; k++){ int w, waga = 1, maxi = 0, maxia, maxib; string s; cin>>w; wezel = new G[w+1]; for(int i=0; i<w; i++) { cin>>s; for(int j=0; j<w; j++){ if(s[j] == '1'){ wezel[i].pol.push_back(make_pair(j, waga)); } } } for(int i=0; i<w; i++){ dijkstra(i, w); for(int j=0; j<w; j++){ if(wezel[j].odl > maxi){ maxi = wezel[j].odl; maxia = i; maxib = j; } } } wezel[maxia].pol.push_back(make_pair(maxib, 0)); wezel[maxib].pol.push_back(make_pair(maxia, 0)); maxi = 0; for(int i=0; i<w; i++){ dijkstra(i, w); for(int j=0; j<w; j++){ if(wezel[j].odl > maxi){ maxi = wezel[j].odl; maxia = i; maxib = j; } } } cout<<maxi<<'\n'; delete [] wezel; } return 0; } |