import math import sys from collections import deque def bfs(n, graph, start): dist = [math.inf] * n dist[start] = 0 q = deque([start]) while q: u = q.popleft() for (v, c) in graph[u]: if dist[v] > dist[u] + c: dist[v] = dist[u] + c if c == 1: q.append(v) else: q.appendleft(v) max_d = max(dist) furthest = dist.index(max_d) return max_d, furthest def graph_diameter(n, graph): _, furthest1 = bfs(n, graph, 0) ans, _ = bfs(n, graph, furthest1) return ans def solve(): n = int(sys.stdin.readline()) g = [[] for _ in range(n)] for u in range(n): for v, c in enumerate(sys.stdin.readline()): if c == '1': g[u].append((v, 1)) ans = graph_diameter(n, g) for u in range(n): for v in range(u + 1, n): g[u].append((v, 0)) g[v].append((u, 0)) ans = min(ans, graph_diameter(n, g)) g[u].pop() g[v].pop() print(ans) def main(): for _ in range(int(sys.stdin.readline())): solve() if __name__ == "__main__": main()
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 | import math import sys from collections import deque def bfs(n, graph, start): dist = [math.inf] * n dist[start] = 0 q = deque([start]) while q: u = q.popleft() for (v, c) in graph[u]: if dist[v] > dist[u] + c: dist[v] = dist[u] + c if c == 1: q.append(v) else: q.appendleft(v) max_d = max(dist) furthest = dist.index(max_d) return max_d, furthest def graph_diameter(n, graph): _, furthest1 = bfs(n, graph, 0) ans, _ = bfs(n, graph, furthest1) return ans def solve(): n = int(sys.stdin.readline()) g = [[] for _ in range(n)] for u in range(n): for v, c in enumerate(sys.stdin.readline()): if c == '1': g[u].append((v, 1)) ans = graph_diameter(n, g) for u in range(n): for v in range(u + 1, n): g[u].append((v, 0)) g[v].append((u, 0)) ans = min(ans, graph_diameter(n, g)) g[u].pop() g[v].pop() print(ans) def main(): for _ in range(int(sys.stdin.readline())): solve() if __name__ == "__main__": main() |