🐸 문제 정보
🤖 알고리즘
벨만포드
⏱️ 풀이 시간
26.27m
📝 풀이
벨만포드 알고리즘을 이용하면 쉽게(?) 풀 수 있는 문제였다.
그럼에도 오래걸린 이유는 INF 값의 처리 때문이었다...
여튼 해당 몬제에서 유의할 점은 아래와 같다.
- 도로의 경우, 양방향이기 때문에 시작점과 끝점 총 두번을 append 해줘야한다.
- 웜홀은 단방향이지만, 가중치가 음수이다.
- 어느점에서 시작해도 상관없다. cycle이 발생하는지 여부에 따라 음수 가중치로 끝날지 결정되기 때문이다.
🧑💻 나의 답
# pypy3
import sys
input = sys.stdin.readline
INF = sys.maxsize
def bellman(start):
distance[start] = 0
for i in range(n):
for s, e, t in graph:
dist = distance[s] + t
if dist < distance[e]:
if i == n - 1:
return True
distance[e] = dist
return False
for _ in range(int(input().rstrip())):
n, m, w = list(map(int, input().rstrip().split()))
graph = []
distance = [INF] * (n + 1)
for _ in range(m): # 도로 -> 양방향
s, e, t = list(map(int, input().rstrip().split()))
graph.append((s, e, t))
graph.append((e, s, t))
for _ in range(w): # 웜홀 -> 단방향
s, e, t = list(map(int, input().rstrip().split()))
graph.append((s, e, -t))
if bellman(1):
print('YES')
else:
print('NO')