반응형
문제
https://www.acmicpc.net/problem/1219
소스코드
import sys
input = sys.stdin.readline
n, start, end, m = map(int, input().split())
graph = {}
for i in range(m):
a, b, c = map(int, input().split())
if a not in graph:
graph[a] = []
graph[a].append((b, c))
money_list = list(map(int, input().split()))
def trans_bellman_ford(start):
distance_list = [-1e9] * (n + 1)
distance_list[start] = money_list[start]
for i in range(n + 100):
for u in graph:
for v, w in graph[u]:
if distance_list[u] == -1e9:
continue
elif distance_list[u] >= 1e9:
distance_list[v] = 1e9
elif distance_list[v] < distance_list[u] + money_list[v] - w:
distance_list[v] = distance_list[u] + money_list[v] - w
if i >= n - 1:
distance_list[v] = 1e9
return distance_list
data = trans_bellman_ford(start)
if data[end] <=-1e9:
print("gg")
elif data[end] >= 1e9:
print("Gee")
else:
print(data[end])
변형된 벨만포드 알고리즘을 사용합니다.
가중치를 뒤집는 것으로 양수사이클을 찾습니다.
n - 1 사이클부터 갱신되는 노드는 양수사이클인것으로 간주하여 체크하고 양수 사이클 노드가 충분히 전파될 수 있도록 사이클을 n + 100번 실행합니다.
변형된 벨만포드 알고리즘으로 생성된 도착리스트를 이용하여 도착지의 값이 초기값이라면 접근할 수 없으니 gg를 양수 사이클이라면 돈을 무한으로 벌 수 있으니 Gee를 출력합니다.
반응형
'Programming > 알고리즘' 카테고리의 다른 글
[백준/Python] 2357번 최솟값과 최댓값 (0) | 2024.11.17 |
---|---|
[백준/Python] 11505번 구간 곱 구하기 (0) | 2024.11.16 |
[백준/Python] 20955번 민서의 응급수술 (1) | 2024.11.14 |
[백준 / Python] 1504번 특정한 최단 경로 (0) | 2024.11.13 |
[백준 / Python] 2166번 다각형의 면적 (0) | 2024.10.27 |
댓글