https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
Problem
- 방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다.
조건
- 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다.
- 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다.
- 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음에 유의한다.
SOL
한 시작점에서 다른 노드로 갈 때, 비용(가중치)를 계산할 때, 최소비용(최단경로)로 방문하는 알고리즘은 다익스트라,벨만포드,플로이드 와샬, A*등등 다양하게 있다.
하지만, 위의 방법들은 다 조금씩 차이가 있다.(차이가 없었다면, 대체하는 방식으로 발전했을것), 이 말은, 최단경로를 구해야하는데, 중간에 음의 가중치가 섞여있다던지 등등의 차이 때문에, 같은 개념에서 여러가지 방법이 나오게 된거다.
이 문제는 w가 10의 이하 자연수 이기 때문에, 다익스트라로 접근을 했다.
다익스트라 , 벨만포드는 따로 글을 정리할거다!
#다익스트라
import sys
import heapq
input = sys.stdin.readline
INF= int(1e9)
V,E = map(int,input().split())
start= int(input().rstrip())
graph=[[] for _ in range(V+1)]
distance=[INF for _ in range(V+1)]
def Dijkstra(n):
hq=[]
heapq.heappush(hq,(0,n))
distance[n]=0
while hq:
dist,now = heapq.heappop(hq)
#현재 방문하는 노드까지의 거리가 , 기록된 거리보다 크다면 기록할 필요가 없다.
if distance[now] < dist:
continue
for nxt,value in graph[now]:
cost=dist+value
if cost<distance[nxt]:
distance[nxt] = cost
heapq.heappush(hq,(cost,nxt))
for i in range(E):
a,b,c=map(int,input().split())
graph[a].append((b,c))
Dijkstra(start)
for i in range(1,V+1):
if distance[i] == INF:
print("INF")
else:
print(distance[i])
'알고리즘 문제(SOL)' 카테고리의 다른 글
[백준/2644/파이썬] 촌수 계산 (0) | 2022.03.04 |
---|---|
[백준/11657/파이썬] 타임 머신 (0) | 2022.03.04 |
[백준/1981/파이썬] 배열에서의 이동 (0) | 2022.03.03 |
[백준/1260/파이썬] DFS와 BFS (0) | 2022.03.03 |
[백준/9370/파이썬] 미확인 도착지 (0) | 2022.03.02 |