문제
14284번: 간선 이어가기 2
정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다.
www.acmicpc.net
입력
- 첫째 줄에 정점의 개수 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가 연결되는 시점의 간선의 가중치 합의 최솟값을 출력하시오,
입력 예제
8 9
1 2 3
1 3 2
1 4 4
2 5 2
3 6 1
4 7 3
5 8 6
6 8 2
7 8 7
1 8
출력 예제
5
풀이
- s와 t가 연결되는 순간 간선 추가를 멈춘 후, 연결되는 순간 가중치의 값이 최소가 되는 값을 구해야 하므로 다익스트라 알고리즘 수행
- 모든 간선들을 입력받은 후, s에서 출발하여 t까지 도착한 최소거리를 출력
코드
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
n, m = map(int,input().split())
graph = [[] for _ in range(n + 1)]
distance = [INF] * (n + 1)
for _ in range(m):
a,b,c = map(int,input().split())
graph[a].append((b,c))
graph[b].append((a, c))
s, t = map(int,input().split())
def dijkstra(start):
q = []
heapq.heappush(q, (0,start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
dijkstra(s)
print(distance[t])'Algorithm > Dijkstra' 카테고리의 다른 글
| [Python] 백준 5972번 택배 배송 (0) | 2023.03.29 |
|---|---|
| [Python] 백준 11779번 최소비용 구하기2 (0) | 2023.03.23 |
| [Python] 백준 10282번 해킹 (0) | 2023.03.20 |
| [Python] 백준 18223번 민준이와 마산 그리고 건우 (2) | 2023.03.20 |
| [Python] 백준 2665번 미로만들기 (0) | 2023.03.17 |