Algorithm/Python

[백준 1389] 케빈 베이컨의 6단계 법칙

🥭맹2 2021. 9. 5. 20:10

1. 문제

https://www.acmicpc.net/problem/1389

 

1389번: 케빈 베이컨의 6단계 법칙

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻

www.acmicpc.net

2. 접근 방법

문제에 등장하는 케빈 베이컨 수는 해당 노드에서 다른 노드를 모두 방문하는 데 필요한 총 길이인데요,

결국 그래프의 최단 길이 문제라 다익스트라 혹은 플로이드 워셜로 풀이할 수 있습니다.

하지만 N이 500이하라서 플로이드워셜을 써도 되겠다 싶었습니다.

 

물론 bfs로도 풀이 가능합니다.

 

플로이드 워셜을 쓰기에 앞서 간단히 설명드리자면

 

거리를 담을 2차 배열을 graph로 초기화 합니다.

이 때 각각의 요소는 최대 거리인 100이상의 값이면 되므로 저는 1000으로 지정했습니다.

 

그리고 입력으로 들어오는 친구 관계를 1로 넣어줫습니다.

 

그리구 3중 for문을 사용하여 a와 b 사이 거리와 a에서 k를 들렸다가 k에서 b에 도착하는 것 중 더 짧은 것으로 갱신해줍니다.

 

요러케 하면 끄읏

 

3. 코드

python

N, M = map(int, input().split())
graph = [[1000] * (N+1) for _ in range(N+1)]

for _ in range(M):
    a, b = map(int, input().split())
    graph[a][b] = 1
    graph[b][a] = 1

for k in range(1, N+1):
    for a in range(1, N+1):
        for b in range(1, N+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

min_sum = 1e9
answer = 0

for i in range(len(graph)):
    if sum(graph[i]) < min_sum:
        min_sum = sum(graph[i])
        answer = i

print(answer)

4. 마치며

다익스트라보다 더욱 직관적인 플로이드 워셜입니다요

'Algorithm > Python' 카테고리의 다른 글

[백준 1726] 로봇  (6) 2021.11.21
[백준 14675] 단절점과 단절선  (0) 2021.10.13
[위클리 챌린지-3주차] 퍼즐 조각 채우기  (0) 2021.08.23
[python] 43236 징검다리  (0) 2021.08.22
[python] 43238 입국심사  (0) 2021.08.22