Algorithm/📊 Problem Solving

[백준/BOJ] 9694 - 무엇을 아느냐가 아니라 누구를 아느냐가 문제다

posted by sangmin

9694 - 무엇을 아느냐가 아니라 누구를 아느냐가 문제다

📌 문제

한신이는 젊고, 똑똑하고 매우 유명한 정치인이다. 그럼에도 그는 여전히 자신의 성공을 위해서도 인간관계는 중요한것이라고 믿고있다. 다음달에 열릴 국회의원선거에서 한신이는 자신의 당이 반드시 이기길 희망한다. 그러기 위해서 최고의원의 지지가 필요하다.

이 최고의원의 지지를 받기위해 한신이는 전략을 세웠다. 그는 그 최고의원을 직접적으로 만날수 없다면 그를 알고있는 인맥을 이용하여 만날것이다. 이것을 위해서 우선 정치인들의 친밀도를 조사하였는데 친밀도를 다음 4단계로 나누어서 기록해놓았다.

최측근 [1] / 측근 [2] / 비즈니스관계 [3] / 지인 [4]

[두 사람의 관계는 이 4가지 경우중 반드시 해당되며, 적(enemy)는 존재하지 않는다.]

한신이는 지인보다는 최측근 친구에게 소개받기 원한다. 그래서 최고의원을 만나기까지의 인맥간 친밀도의 합을 최소화하고 싶어한다.

N명의 정치인 명단으로부터 그들의 인맥 친밀도가 주어진다. 정치인 리스트를 보고 한신이가 최고의원을 만나기까지의 친밀도의 합 중에서 가장 작은 값을 구하면 된다.

📋 코드

import heapq

def dijkstra(start):
    q = []
    heapq.heappush(q, (0, start))
    distance[start] = 0

    while q:
        dist, now = heapq.heappop(q)

        if distance[now] >= dist:
            for pos, c in graph[now]:
                cost = dist + c

                if cost < distance[pos]:
                    tmp[pos] = now
                    q.append((cost, pos))
                    distance[pos] = cost


X = int(input())
for x in range(1, X+1):
    N, M = map(int, input().split())
    graph = [[] for _ in range(M)]
    distance = [int(1e9) for _ in range(M)]
    tmp = [-1 for _ in range(M)]

    for _ in range(N):
        a, b, cost = map(int, input().split())
        graph[a].append((b, cost))
        graph[b].append((a, cost))

    dijkstra(0)

    result = [M-1]
    idx = M-1
    while tmp[idx] != -1:
        idx = tmp[idx]
        result.append(idx)

    result.reverse()
    if len(result) == 1:
        result = [-1]

    print('Case #{}:'.format(x), *result)

💡 한마디

단순한 최단 경로 문제인 줄 알았는데, 생각보다 직접적인 경로를 찾는 데 애먹었다.

 

9694번: 무엇을 아느냐가 아니라 누구를 아느냐가 문제다

맨위 첫 번째 줄에 T(1 <t< 100)는="" 테스트케이스="" 수를="" 의미한다.="" 이것을="" 따라="" 다음줄에="" 각="" 테스트="" 케이스가="" 주어지는데,="" 첫="" 번째="" 줄에는="" n과="" m이="" 주어진다.="" n(n="" ≤="" 20)은="" 관계의="" 개수를="" 의미하며,="" m(5="" ≤<="" p=""> </t<>

www.acmicpc.net