728x90
1865번: 웜홀
첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500),
www.acmicpc.net
🤔 문제분석
밸만포드로 문제를 해결할 수 있습니다. 어떠한 노드에서 출발해도 상관이 없기때문에 1번 노드에서 출발 하여 문제를 해결하였습니다.
💻 코드
import sys
input = sys.stdin.readline
TC = int(input())
def bellman_ford(start):
distance = [INF for _ in range(N+1)]
distance[start] = 0
for n in range(N):
for e in range(M*2 + W):
start, end, cost = edge[e][0], edge[e][1], edge[e][2]
new_cost = distance[start] + cost
if distance[end] > new_cost:
distance[end] = new_cost
if n == N-1:
return True
return False
for _ in range(TC):
N, M, W = map(int, input().split())
edge = []
INF = sys.maxsize
for _ in range(M):
S, E, T = map(int, input().split())
edge.append((S, E, T))
edge.append((E, S, T))
for _ in range(W):
S, E, T = map(int, input().split())
edge.append((S, E, -T))
if bellman_ford(1):
print("YES")
else:
print("NO")
🎯 피드백 및 개선사항
기존 벨만포트와 다른것은 distance[start] ≠ INF 일때만 방문했었는데, 그렇지 않아도 됩니다. 왜냐하면 연결되어있지 않는 간선이 존재할 수 있을 뿐더러, 우리가 구하고자하는것은 음의간선으로 무한 사이클이 있는지 판별하는거에 관심이 있기 때문입니다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 6593번 : 상범 빌딩 (0) | 2024.03.18 |
---|---|
[백준] 2458번 : 키 순서 (1) | 2024.03.16 |
[백준] 1613번 : 역사 (0) | 2024.03.10 |
[백준] 4179번 : 불! (0) | 2024.03.10 |
[백준] 11779번 : 최소비용 구하기2 (0) | 2024.03.05 |