728x90
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
플루이드-워셜 알고리즘을 써도 괜찮지만 결국 한 지점에서 다른 지점까지의 최소거리의 합을 구하면 되는 문제이기 때문에 다익스트라 알고리즘을 여러 번 써서 풀었습니다.
import heapq
def solution(N, M, data_list):
# 트리
tree = [[] for _ in range(N+1)]
for data in data_list:
tree[data[0]].append(data[1])
tree[data[1]].append(data[0])
# 케비 베이컨 리스트
kb_list = []
# 모든 사람을 시작점으로 다익스트라
for user in range(1, N+1):
kb_list.append(dijkstra(user, tree, N))
# 가장 작은 사람 출력
return kb_list.index(min(kb_list))+1
def dijkstra(start, tree, N):
# 시스템상 최대 수
inf = 5000
# 최단거리 리스트
dist_list = [5000 for _ in range(N+1)]
dist_list[start] = 0
# 큐
hq = [[0, start]]
# 순회
while True:
# 큐가 비면 끝
if not hq:
return sum(dist_list[1:])
# 누적거리, 현재 노드
dist, now_node = heapq.heappop(hq)
# 누적거리가 현재 노드의 최소거리보다 길면 패스
if dist > dist_list[now_node]:
continue
# 다음 노드에서의 누적거리
next_dist = dist + 1
# 이동 가능한 노드 순회
for next_node in tree[now_node]:
# 다음 누적거리와 다음 최소거리 비교
if dist_list[next_node] > next_dist:
dist_list[next_node] = next_dist
# 큐에 푸시
heapq.heappush(hq, [next_dist, next_node])
N, M = map(int, input().split())
data_list = [list(map(int, input().split())) for _ in range(M)]
print(solution(N, M, data_list))
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 16953 <A -> B> Python (1) | 2023.11.18 |
---|---|
백준 1764 <듣보잡> Python (0) | 2023.11.16 |
백준 1007 <벡터 매칭> Python (1) | 2023.11.15 |
백준 1005 <ACM Craft> Python (0) | 2023.11.15 |
백준 1753 <최단경로> Python (1) | 2023.11.14 |