일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 인터섹션
- 리터럴 타입
- TS
- recoil
- autosize
- 결정 알고리즘
- map
- Cypress
- React
- webpack
- async/await
- 태그된 유니온
- 이분 검색
- 공변성
- 타입 좁히기
- Promise
- 반공변성
- CI/CD
- dfs
- app router
- 투포인터
- useAppDispatch
- RTK Query
- 호이스팅
- Jest
- ESlint
- tailwind
- CORS
- SSR
- 무한 스크롤
Archives
- Today
- Total
짧은코딩
1753 최단경로 본문
반응형
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
해결법
이 문제는 다익스트라 알고리즘을 활용해서 푸는 문제다. graph에 연결된 노드를 저장할 때는 플로이드 알고리즘과 다르게 저장한다는 점을 다시 기억하면 좋을 것 같다. 다익스트라 알고리즘에서 graph에 연결된 노드를 저장하는 법은 시작 노드 a, 연결된 노드 b, 가중치 c를 graph[a].append(b, c)이다. 이 점을 유의하고 푼다면 좀 더 빨리 문제를 풀 수 있을 것 같다.
플로이드 알고리즘으로도 문제를 풀어봤지만 메모리 초과가 발생했다.
코드
import heapq
v, e = map(int, input().split())
start = int(input())
INF = int(1e9)
graph = [[] for i in range(v+1)]
distance = [INF] * (v+1)
for i in range(e):
a, b, c = map(int, input().split())
graph[a].append((b, c))
def dijkstra(start):
distance[start] = 0
q = []
heapq.heappush(q, (0, start))
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(start)
for i in range(1, v+1):
if distance[i] < INF:
print(distance[i])
else:
print("INF")
이 처럼 다익스트라 알고리즘을 활용해서 문제를 풀 수 있다.
반응형
'코딩 테스트(Python) > 백준, 프로그래머스' 카테고리의 다른 글
프로그래머스) 메뉴 리뉴얼(조합) (0) | 2023.02.21 |
---|---|
1931 회의실 배정 (0) | 2022.06.29 |
9095 1, 2, 3 더하기 (0) | 2022.06.26 |
17219 비밀번호 찾기 (0) | 2022.06.25 |
1로 만들기(백준) (0) | 2022.06.22 |
Comments