알고리즘(algorithm)/백준

백준 14284 간선 이어가기2 python

희-야 2023. 2. 16. 19:15
 

14284번: 간선 이어가기 2

정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다.

www.acmicpc.net

문제

정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다. 이때, 특정 정점 s와 t가 연결이 되는 시점에서 간선 추가를 멈출 것이다. 연결이란 두 정점이 간선을 통해 방문 가능한 것을 말한다.

s와 t가 연결이 되는 시점의 간선의 가중치의 합이 최소가 되게 추가하는 간선의 순서를 조정할 때, 그 최솟값을 구하시오.

입력

첫째 줄에 정점의 개수 n, 간선리스트의 간선 수 m이 주어진다.(2≤n≤5000,1≤m≤100,000)

다음 m줄에는 a,b,c가 주어지는데, 이는 a와 b는 c의 가중치를 가짐을 말한다. (1≤a,b≤n,1≤c≤100,a≠b)

다음 줄에는 두 정점 s,t가 주어진다. (1≤s,t≤n,s≠t)

모든 간선을 연결하면 그래프는 연결 그래프가 됨이 보장된다.

출력

s와 t가 연결되는 시점의 간선의 가중치 합의 최솟값을 출력하시오.

풀이

from heapq import heappop, heappush

n, m = map(int, input().split())
# 정점과 그래프의 개수를 받아줍니다.
graph = [[] for _ in range(n + 1)]
INF = 1e11
visited = [INF for _ in range(n + 1)]

for i in range(m):
    p1, p2, d = map(int, input().split())
    graph[p1].append((d, p2)), graph[p2].append((d, p1))
# 간선을 입력받고 각 정점에 도달하는 값으로 최댓값을 입력해줍니다.

def dijkstra(a):
    heap = []
    heappush(heap, (0, a))
    visited[a] = 0
    # a에 가는 비용을 0으로 만들고 힙에 0, a를 튜플 형태로 넣어줍니다.
    while heap:
        cost, p = heappop(heap)
        if visited[p] < cost:
            continue
        for dis, e in graph[p]:
            new = cost + dis
            if visited[e] > new:
                visited[e] = new
                heappush(heap, (new, e))
                # 연결된 정점에 더 적은 비용으로 이동 가능하면 값을 갱신하고 힙에 넣어줍니다.

start, end = map(int, input().split())
dijkstra(start)
print(visited[end])
# 확인할 두 정점을 받고 시작점에서 각 정점에 도달하는 최소 비용을 확인후 도착 정점까지
# 드는 비용을 출력해줍니다.