-
[boj]1504 특정한 최단 경로알고리즘 2021. 1. 15. 11:40
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
[해설]
여러번의 dijkstra로 문제를 해결했다.
1--N 으로 가는데, 특정한 정점 A와 B를 지나는 경로는 2가지이다.
1-->A-->B-->N
1-->B-->A-->N
이래서 각각 경로에대해 최단경로를 찾아서 min값을 구해줬다.
from heapq import heappush, heappop import sys INF = sys.maxsize def dik(s,e,m): cur_i=s cur_w=0 q=[(cur_w,cur_i)] v_w=[INF]*(len(m)+1) v_w[s]=0 while q: if v_w[cur_i]<cur_w:#더 작은것이 있으면 패스 continue for idx, i in enumerate(m[cur_i]): if cur_w+i<v_w[idx]: heappush(q,(cur_w+i,idx)) v_w[idx]=cur_w+i cur_w,cur_i=heappop(q) return v_w[e] f=open('input.txt','r') V,E=map(int,f.readline().strip().split(' ')) m=[[INF]*(V+1) for i in range(V+1)] for i in range(E): s,e,w=map(int,f.readline().strip().split(' ')) m[s][e]=w m[e][s]=w A,B=map(int,f.readline().strip().split(' ')) result=min(dik(1,A,m)+dik(A,B,m)+dik(B,V,m),dik(1,B,m)+dik(B,A,m)+dik(A,V,m)) print(result if result<INF else -1)
'알고리즘' 카테고리의 다른 글
[boj] 14003,11722 가장 긴 증가 부분 수열 (feat. bisect) (0) 2021.01.17 [boj]합분해 (0) 2021.01.16 [boj]오르막수 (0) 2021.01.15 [kakao 2020]기둥과 보 설치 (0) 2021.01.14 [kakao 2019 internship]징검다리 건너기 (0) 2021.01.12