https://www.acmicpc.net/problem/1865
1865번: 웜홀
첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500),
www.acmicpc.net

풀이
음수간선이 포함되었기에 벨만 포드 알고리즘을 사용한다. 만일 n번의 시도에서도 최단경로간 갱신된다면 음수간선이 존재한다.
# 1865번 웜홀
import sys
input = sys.stdin.readline
INF = int(1e9)
def bf():
distance = [INF] * (n+1)
# 시작 노드에 대해서 초기화
distance[1] = 0
# 전체 n번의 라운드(round)를 반복
for i in range(n):
# 매 반복마다 "모든 간선"을 확인하며
for v, nv, w in edges:
# 현재 간선을 거쳐서 다른 노드로 이동하는 거리가 더 짧은 경우
# INF인 값도 찾아준다면 간선이 이어지지않은 사이클도 발견할 수 있다.
if distance[nv] > distance[v] + w:
distance[nv] = distance[v] + w
# n번째 라운드에서도 값이 갱신된다면 음수 순환이 존재
if i == n-1:
return True
return False
t = int(input())
for _ in range(t):
n, road, wormhole = map(int, input().split())
edges = []
for _ in range(road):
a, b, c = map(int, input().split())
edges.append((a, b, c))
edges.append((b, a, c))
for _ in range(wormhole):
a, b, c = map(int, input().split())
edges.append((a, b, -c))
if bf():
print("YES")
else:
print("NO")
출력결과

'백준 > 최단거리' 카테고리의 다른 글
[백준] 18352번 특정 거리의 도시 찾기 - 파이썬 (0) | 2022.02.19 |
---|---|
[백준] 10159번 저울 - 파이썬 (0) | 2022.02.18 |
[백준] 1238번 파티 - 파이썬 (0) | 2022.02.12 |
[백준] 11657번 타임머신 - 파이썬 (0) | 2022.02.12 |
[백준] 1504번 특정한 최단 경로 - 파이썬 (0) | 2022.02.12 |
https://www.acmicpc.net/problem/1865
1865번: 웜홀
첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500),
www.acmicpc.net

풀이
음수간선이 포함되었기에 벨만 포드 알고리즘을 사용한다. 만일 n번의 시도에서도 최단경로간 갱신된다면 음수간선이 존재한다.
# 1865번 웜홀
import sys
input = sys.stdin.readline
INF = int(1e9)
def bf():
distance = [INF] * (n+1)
# 시작 노드에 대해서 초기화
distance[1] = 0
# 전체 n번의 라운드(round)를 반복
for i in range(n):
# 매 반복마다 "모든 간선"을 확인하며
for v, nv, w in edges:
# 현재 간선을 거쳐서 다른 노드로 이동하는 거리가 더 짧은 경우
# INF인 값도 찾아준다면 간선이 이어지지않은 사이클도 발견할 수 있다.
if distance[nv] > distance[v] + w:
distance[nv] = distance[v] + w
# n번째 라운드에서도 값이 갱신된다면 음수 순환이 존재
if i == n-1:
return True
return False
t = int(input())
for _ in range(t):
n, road, wormhole = map(int, input().split())
edges = []
for _ in range(road):
a, b, c = map(int, input().split())
edges.append((a, b, c))
edges.append((b, a, c))
for _ in range(wormhole):
a, b, c = map(int, input().split())
edges.append((a, b, -c))
if bf():
print("YES")
else:
print("NO")
출력결과

'백준 > 최단거리' 카테고리의 다른 글
[백준] 18352번 특정 거리의 도시 찾기 - 파이썬 (0) | 2022.02.19 |
---|---|
[백준] 10159번 저울 - 파이썬 (0) | 2022.02.18 |
[백준] 1238번 파티 - 파이썬 (0) | 2022.02.12 |
[백준] 11657번 타임머신 - 파이썬 (0) | 2022.02.12 |
[백준] 1504번 특정한 최단 경로 - 파이썬 (0) | 2022.02.12 |