#include <cstdio> #include <vector> #include <queue> #include <algorithm> int results[30]; int dists[407][407]; void bfs(int u, int n, std::vector<std::vector<int>>& v) { std::vector<bool> visited(n, false); std::queue<int> q; for(int i=0; i<n; i++) { dists[u][i]=n+1; } dists[u][u]=0; q.push(u); while(!q.empty()) { int w = q.front(); q.pop(); if(visited[w]) continue; visited[w]=true; for(int i=0; i<v[w].size(); i++) { q.push(v[w][i]); dists[u][v[w][i]] = std::min(dists[u][v[w][i]], dists[u][w]+1); } } } int main() { int t,n; char c; scanf("%d", &t); for(int h=0; h<t; h++) { scanf("%d\n", &n); std::vector<std::vector<int>> v(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%c", &c); if(c=='1') { v[i].push_back(j); } } scanf("%c", &c); } for(int i=0; i<n; i++) { bfs(i, n, v); } int globalMaxDist = n+1; for(int i=0; i<n; i++) { for(int j=i+1; j<n; j++) { int localMaxDist = 0; for(int k=0; k<n; k++) { for(int l=k+1; l<n; l++) { int distance1 = dists[j][k] + dists[i][l]; int distance2 = dists[j][l] + dists[i][k]; int distance3= dists[k][l]; int optDist = std::min(distance1, std::min(distance2, distance3)); if(optDist > localMaxDist) { localMaxDist = optDist; if(localMaxDist >= globalMaxDist) break; } } if(localMaxDist >= globalMaxDist) break; } globalMaxDist = std::min(localMaxDist, globalMaxDist); } } results[h] = globalMaxDist; } for(int h=0; h<t; h++) { printf("%d\n", results[h]); } 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 93 | #include <cstdio> #include <vector> #include <queue> #include <algorithm> int results[30]; int dists[407][407]; void bfs(int u, int n, std::vector<std::vector<int>>& v) { std::vector<bool> visited(n, false); std::queue<int> q; for(int i=0; i<n; i++) { dists[u][i]=n+1; } dists[u][u]=0; q.push(u); while(!q.empty()) { int w = q.front(); q.pop(); if(visited[w]) continue; visited[w]=true; for(int i=0; i<v[w].size(); i++) { q.push(v[w][i]); dists[u][v[w][i]] = std::min(dists[u][v[w][i]], dists[u][w]+1); } } } int main() { int t,n; char c; scanf("%d", &t); for(int h=0; h<t; h++) { scanf("%d\n", &n); std::vector<std::vector<int>> v(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%c", &c); if(c=='1') { v[i].push_back(j); } } scanf("%c", &c); } for(int i=0; i<n; i++) { bfs(i, n, v); } int globalMaxDist = n+1; for(int i=0; i<n; i++) { for(int j=i+1; j<n; j++) { int localMaxDist = 0; for(int k=0; k<n; k++) { for(int l=k+1; l<n; l++) { int distance1 = dists[j][k] + dists[i][l]; int distance2 = dists[j][l] + dists[i][k]; int distance3= dists[k][l]; int optDist = std::min(distance1, std::min(distance2, distance3)); if(optDist > localMaxDist) { localMaxDist = optDist; if(localMaxDist >= globalMaxDist) break; } } if(localMaxDist >= globalMaxDist) break; } globalMaxDist = std::min(localMaxDist, globalMaxDist); } } results[h] = globalMaxDist; } for(int h=0; h<t; h++) { printf("%d\n", results[h]); } return 0; } |