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() |
English