[백준/파이썬] 1389번 케빈 베이컨의 6단계 법칙 풀이

업데이트:



문제 정보


풀이

문제

사람 간 친구 관계 그래프가 주어질 때, 각 사람의 케빈 베이컨 수(다른 모든 사람까지 최단거리 합)를 계산해 가장 작은 사람 번호를 출력하는 문제입니다.

코드

import sys;read=sys.stdin.readline
from collections import deque

# 입력
n,m=map(int,read().split())
d=[[0]*n for _ in range(n)] # d[a-1][b-1] = d[b-1][a-1] = a와 b의 친구 단계

for i in range(m):
    a,b=map(int,read().split())
    d[a-1][b-1] = d[b-1][a-1] = 1

# print(d)

# BFS 준비
q=deque([])
enQ=q.append
deQ=q.popleft

# BFS
for i in range(n):
    q.clear()
    visited = [False]*n
    enQ((i,0))
    visited[i] = True
    
    while q:
        j,lv=deQ()
        for k in range(n):
            if not visited[k] and d[j][k] == 1:
                d[i][k] = d[k][i] = lv+d[j][k]
                enQ((k,lv+d[j][k]))
                visited[k] = True
# print(d)

r = list(map(sum,d))
print(r.index(min(r))+1)

설명

각 정점을 시작점으로 BFS를 수행해 다른 정점까지의 최단 거리를 채웁니다.

모든 정점에 대해 거리 합을 구하고, 최솟값의 인덱스(1-based)를 출력합니다.



댓글남기기