ARC 090 D People on a Line【Python】

問題はこちら

グラフに負閉路が存在するかどうか。ポテンシャルが矛盾なく定義できることと負閉路が存在しないことが同値であることを利用する。幅優先探索で実装。

from collections import deque

N, M = map(int, input().split())
conn = [[] for _ in range(N)]
for _ in range(M):
   L, R, D = map(int, input().split())
   L -= 1; R -= 1
   conn[L].append((R, D))
   conn[R].append((L, -D))
   
OK = True
potential = [float('inf')]*N
for v in range(N):
   if potential[v] == float('inf'):
       q = deque([v])
       potential[v] = 0
       while q:
           x = q.popleft()
           for y, d in conn[x]:
               if potential[y] < float('inf'):
                   if potential[y] != potential[x] + d:
                       OK = False
                       break
                   continue
               potential[y] = potential[x] + d
               q.append(y)
           if not OK:
               break
   if not OK:
       break
       
print("Yes" if OK else "No")


この記事が気に入ったらサポートをしてみませんか?