문제 : 백준 1865번 웜홀
틀린 풀이 : 플로이드-와샬 알고리즘
틀린 이유 : 음수 사이클?
맞은 풀이 : 벨만-포드 알고리즘
설명
풀이
후기
# 음수 사이클?
import sys
def get_dist_list(v, edge_list):
dist_list = [[float('inf') for _ in range(v+1)] for _ in range(v+1)]
for s, e, w in edge_list:
dist_list[s][e] = w
for k in range(1, v+1):
for i in range(1, v+1):
for j in range(1, v+1):
dist_list[i][j] = min(dist_list[i][j], dist_list[i][k]+dist_list[k][j])
pass
return dist_list
tc = int(sys.stdin.readline().rstrip())
for _ in range(tc):
v, e1, e2 = map(int, sys.stdin.readline().rstrip().split(' '))
edge_list = []
for i in range(e1):
s, e, t = map(int, sys.stdin.readline().rstrip().split(' '))
edge_list.append((s,e,t))
edge_list.append((e,s,t))
for i in range(e2):
s, e, t = map(int, sys.stdin.readline().rstrip().split(' '))
edge_list.append((s,e,-t))
dist_list = get_dist_list(v, edge_list)
possible = False
for i in range(1, v+1):
if dist_list[i][i] < 0:
possible = True
break
if possible:
print('YES')
else:
print('NO')
pass
import sys
def 초기화():
지점개수, 도로개수, 웜홀개수 = map(int, sys.stdin.readline().split())
연결리스트 = []
for _ in range(도로개수):
출발지, 도착지, 시간 = map(int, sys.stdin.readline().split(' '))
연결리스트.append((출발지, 도착지, 시간))
연결리스트.append((도착지, 출발지, 시간))
for _ in range(웜홀개수):
출발지, 도착지, 시간 = map(int, sys.stdin.readline().split())
연결리스트.append((출발지, 도착지, -시간))
return 지점개수, 도로개수, 웜홀개수, 연결리스트
def 음수사이클(지점개수, 연결리스트):
# float('inf')로 초기화하면 틀림
거리리스트 = [999999 for _ in range(지점개수+1)]
거리리스트[1] = 0
for _ in range(지점개수):
for 출발지, 도착지, 시간 in 연결리스트:
거리리스트[도착지] = min(거리리스트[도착지], 거리리스트[출발지] + 시간)
for 출발지, 도착지, 시간 in 연결리스트:
if 거리리스트[도착지] > 거리리스트[출발지] + 시간:
return True
return False
테스트케이스 = int(sys.stdin.readline())
for _ in range(테스트케이스):
지점개수, 도로개수, 웜홀개수, 연결리스트 = 초기화()
if 음수사이클(지점개수, 연결리스트):
print('YES')
else:
print('NO')
왜 float로 하면 안될까요?