한 지점에서 출발을 해서 다시 출발하였던 위치로 왔을 때보다 시간이 되돌아가는 경우가 있는지 확인
그래프의 특성을 살펴보면 시간이 줄어드는 음수의 경우가 나타나게 된다. 이 경우에는 벨만 포드 알고리즘을 사용해야 한다.
기본 형태
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = []
self.nodes = []
def add_edge(self, s, d, w):
self.graph.append([s, d, w])
def addNode(self, value):
self.nodes.append(value)
def print_solution(self, dist):
print("Distance of Vertex from Source")
for key, value in dist.items():
print(' ' + key, ' : ', value)
def bellmanFord(self, src):
dist = {i: float("Inf") for i in self.nodes}
dist[src] = 0
for temp in range(self.V-1):
for s, d, w in self.graph:
if dist[s] != float("Inf") and dist[s] + w < dist[d]:
dist[d] = dist[s] + w
for s, d, w in self.graph:
if dist[s] != float("Inf") and dist[s] + w < dist[d]:
print("Graph contanins negative cycle")
return
self.print_solution(dist)
g = Graph(5)
g.addNode("A")
g.addNode("B")
g.addNode("C")
g.addNode("D")
g.addNode("E")
g.add_edge("A", "C", 6)
g.add_edge("A", "D", 6)
g.add_edge("B", "A", 3)
g.add_edge("C", "D", 1)
g.add_edge("D", "C", 2)
g.add_edge("D", "B", 1)
g.add_edge("E", "B", 4)
g.add_edge("E", "D", 2)
g.bellmanFord("E")
from dis import dis
import sys
input = sys.stdin.readline
INF = sys.maxsize
def bellmanFord():
dist = {i: INF for i in range(1, N+1)}
for i in range(1, N+1):
for j in range(1, N+1):
for w, d in edges[j]:
if dist[d] > w + dist[j]:
dist[d] = w + dist[j]
if i == N:
return "YES"
return "NO"
TC = int(input())
for _ in range(TC):
N, M, W = map(int, input().split())
edges = [[] for _ in range(N+1)]
for _ in range(M):
S, E, T = map(int, input().split())
edges[S].append((T, E))
edges[E].append((T, S))
for _ in range(W):
S, E, T = map(int, input().split())
edges[S].append((-T, E))
print(bellmanFord())