내용으로 건너뛰기
테페리넷
사용자 도구
등록
로그인
사이트 도구
검색
도구
문서 보기
Fold/unfold all
역링크
미디어 관리자
사이트맵
등록
로그인
>
미디어 관리자
사이트맵
현재 위치:
테페리넷
»
Problem Solving
»
문제
»
백준 온라인 저지 (BOJ)
»
특정한 최단 경로
ps:problems:boj:1504
이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
====== 특정한 최단 경로 ====== ===== 풀이 ===== * S에서 E까지 가는 동안 x와 y를 거쳐야 한다. 그렇다면 S->x->y->E 로 가거나 S->y->x->E 로 가는 두가지중 하나이므로, 둘중에서 짧을쪽을 택하면된다. * 이를 계산하려면 S-x, x-y, y-E, S-y, x-E 사이의 거리를 알아야 하는데, 이는 다익스트라 알고리즘을 시작점을 x로 놓고 한번 돌리고, y로 놓고 한번 돌려서 총 2번 돌리면 얻을수 있다. * 시간복잡도는 O(ElogV) * 이 문제는 N이 최대 800, 양방향 엣지가 최대 200,000으로 주어지므로, 이정도면 꽤나 dense한 그래프라고 생각해서, 힙을 사용하지 않는 O(V^2)의 다익스트라 알고리즘으로도 도전해보았다. 열심히 최적화해서 O(ElogV)의 다익스트라와 거의 비슷한 속도를 내는데까지는 왔지만, 더 빨라지지는 못했다 (힙: 388ms vs 리스트 392ms). 다만 O(V^2) 다익스트라쪽이 메모리면에서 효율적이라는 것은 확인했다 (힙: 58240KB vs 리스트 38084ms) ===== 코드 ===== <dkpr py> """Solution code for "BOJ 1504. 특정한 최단 경로". - Problem link: https://www.acmicpc.net/problem/1504 - Solution link: http://www.teferi.net/ps/problems/boj/1504 Tags: [Dijkstra] """ import sys from teflib import graph as tgraph INF = float('inf') def main(): N, E = [int(x) for x in sys.stdin.readline().split()] wgraph = [{} for _ in range(N)] for _ in range(E): a, b, c = [int(x) for x in sys.stdin.readline().split()] wgraph[a - 1][b - 1] = wgraph[b - 1][a - 1] = c v1, v2 = [int(x) for x in sys.stdin.readline().split()] dist_from_v1 = tgraph.dijkstra(wgraph, v1 - 1) dist_from_v2 = tgraph.dijkstra(wgraph, v2 - 1) dist = dist_from_v1[v2 - 1] + min(dist_from_v1[0] + dist_from_v2[N - 1], dist_from_v2[0] + dist_from_v1[N - 1]) print('-1' if dist == INF else dist) if __name__ == '__main__': main() </dkpr> * Dependency: [[:ps:teflib:graph#dijkstra|teflib.graph.dijkstra]] {{tag>BOJ ps:problems:boj:골드_4}}
ps/problems/boj/1504.txt
· 마지막으로 수정됨: 2022/09/19 08:42 저자
teferi
문서 도구
문서 보기
역링크
Fold/unfold all
맨 위로