모임에서 회장을 선출하기 위해 후보를 선정하는 문제다.
회원들 간의 친구 여부가 주어졌을 때, 모든 회원과 친구인 회원은 1점, 모든 회원과 친구이거나 친구의 친구이면 2점, ... 이런 식으로 점수가 매겨진다.
가장 작은 점수인 회원이 회장이 된다 할 때, 회장의 점수와 회장 후보를 구하는 문제다.
import sys
read = sys.stdin.readline
N = int(read())
INF = sys.maxsize
graph = [[INF] * N for _ in range(N)]
for i in range(N):
graph[i][i] = 0
while True:
a, b = map(int, read().split())
if a == -1:
break
graph[a-1][b-1] = graph[b-1][a-1] = 1
for k in range(N):
for i in range(N):
for j in range(N):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
levels = [max(filter(lambda x: x != INF, row)) for row in graph]
min_level = min(levels)
candidates = [i + 1 for i, level in enumerate(levels) if level == min_level]
print(min_level, len(candidates))
print(*candidates)
INF
로 설정.