Python/백준

1956_운동

728x90

https://www.acmicpc.net/problem/1956

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net

 

 

이제 그래프를 활용해서 최단거리를 구하는 것은 익숙해졌다! 사이클을 구하기 위해서 어떻게 해야할까 고민하다가

결국 사이클이란 것은 본인에서 시작해서 본인으로 돌아오는 최단거리라고 생각했다.

 

지금까지 코드를 구현할때는 1번에서 1번으로 가는것은 0으로 두었었는데, 이를 그냥 설정하지 않고 코드를 진행시키고, INF가 아닌 최솟값을 찾는 코드를 구현하면 될것같아서 해 보았더니 동작하였다!

 

import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
v,e = map(int,input().split())
graph = [ [] for _ in range(v+1) ]

for _ in range(e):
    a,b,c = map(int,input().split())
    graph[a].append((b,c))

dist = [ [INF] * (v + 1) for _ in range(v+1) ]

def f(start):
    #dist[start][start] = 0
    q = []
    heapq.heappush(q,(start,0))

    while q:
        node,cnt = heapq.heappop(q)

        if dist[start][node] < cnt:
            continue
        for i,j in graph[node]:
            if dist[start][i] > cnt + j:
                dist[start][i] = cnt + j
                heapq.heappush(q,(i,cnt+j))

for i in range(1,v+1):
    f(i)
result = INF
for i in range(1,v+1):
    result = min(result,dist[i][i])
print(result if result != INF else -1)
728x90

'Python > 백준' 카테고리의 다른 글

1806_부분합  (0) 2022.04.16
3273_두수의 합  (0) 2022.04.13
10217_KCM Travel  (0) 2022.04.10
11404_플로이드  (0) 2022.04.09
11657_타임머신(벨만포드)  (0) 2022.04.08