問題
D – 高橋くんと木の直径
回答
20点回答
全て探索します。
AtCoder Beginner Contest 019 解説 from AtCoder Inc.
import sys
N = int(input())
ans = 0
for i in range(N):
for j in range(i+1, N):
print ("? {0} {1}".format(i+1, j+1))
sys.stdout.flush()
dist = int(input())
ans = max(ans, dist)
print('! ' + str(ans))
100点回答
AtCoder Beginner Contest 019 解説 from AtCoder Inc.
スライドでも十分わかりますが、以下がとてもわかりやすかったです。
また、double-sweep は英語ですが以下にあります。
Linear‐time graph distance and diameter approximation
import sys
N = int(input())
# 木の頂点から一番離れた頂点vを求める。
farthest_vertex = 0
max_distance = 0
for i in range(N):
print("? {} {}".format(1,i+1))
sys.stdout.flush()
distance = int(input())
if max_distance < distance:
farthest_vertex = i + 1
max_distance = distance
# vから最も離れた点までの距離が直径になる
ans = 0
for i in range(N):
if farthest_vertex == i+1:
continue
print("? {} {}".format(farthest_vertex, i+1))
sys.stdout.flush()
distance = int(input())
if ans < distance:
ans = distance
print("! {}".format(ans))