Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 파이썬
- Flutter
- 백준
- 개발
- vuejs
- 코테
- DFS
- 동적계획법
- 코딩테스트
- C++
- DFS와BFS
- Python
- django
- android
- DART
- 동적계획법과최단거리역추적
- cos pro
- Vue
- 코드품앗이
- AndroidStudio
- cos pro 1급
- Algorithm
- 안드로이드
- 알고리즘
- 안드로이드스튜디오
- codingtest
- cos
- issue
- 분할정복
- BAEKJOON
Archives
- Today
- Total
Development Artist
[Baekjoon, Python] 9370번 : 미확인 도착지 본문
728x90
반응형
도입
백준 단계별 풀기 최단경로 세 번째 문제이다.
풀이
1. s(var_start)에서 시작하여 g(point_one), h(point_two)를 무조건 지나서 도착지 후보 x1(list_dest[0], x2(list_dest[1], ...를 가는데, 최단거리를 구하는 문제.
2. 그렇다면 [s->g->h->x1] or [s->h->g->x1] 의 최단거리를 구해서 두개 중 출발지점->도착지점의 최단거리라면 results에 저장해준다.
코드
from sys import stdin
from heapq import heappush, heappop
INF = 1e7
def dijkstra(start):
heap = []
heappush(heap, [0, start]) # 시작 노드 최단 경로 0
shortest_weight = [INF for i in range(point_count + 1)] # 최단거리 값, 무한으로 초기화
shortest_weight[start] = 0
while heap:
pre_weight, now_node = heappop(heap)
for now_edge, now_weight in list_s[now_node]:
weight = pre_weight + now_weight
if shortest_weight[now_edge] > weight:
shortest_weight[now_edge] = weight
heappush(heap, [weight, now_edge])
return shortest_weight
testcase_count = int(stdin.readline())
for _ in range(testcase_count):
point_count, load_count, candidate_count = map(int, stdin.readline().split()) # n:교차로, m:도로, t:목적지후보
var_start, point_one, point_two = map(int, stdin.readline().split()) # s:예술가출발, g:지점1 h:지점2
list_s = [[] for i in range(point_count + 1)]
list_dest = []
for _ in range(load_count):
from_a, to_b, load_weight = map(int, stdin.readline().split()) # a와 b사이에 길이 d의 양방향 도로
list_s[from_a].append([to_b, load_weight])
list_s[to_b].append([from_a, load_weight])
for _ in range(candidate_count):
list_dest.append(int(stdin.readline())) # t개의 목적지 후보들, 서로 다른 위치며, 모두 s가 아니다.
start_ = dijkstra(var_start)
point_one_ = dijkstra(point_one)
point_two_ = dijkstra(point_two)
results = []
for l in list_dest:
if start_[point_one] + point_one_[point_two] + point_two_[l] == start_[l] or start_[point_two] + point_two_[point_one] + point_one_[l] == start_[l]:
results.append(l)
results.sort()
for f in results:
print(f, end=' ')
print()
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, Python] 7569번 : 토마토 (0) | 2021.04.26 |
---|---|
[Baekjoon, Python] 11047번 : 동전 0 (0) | 2021.04.08 |
[Baekjoon, Python] 1504번 : 특정한 최단 경로 (0) | 2021.03.19 |
[Baekjoon, Python] 1753번 : 최단경로 (0) | 2021.03.17 |
[Baekjoon, Python] 1707번 : 이분 그래프 (0) | 2021.03.15 |
Comments