1865虫洞-最短距離(ベルマンフォード)
1443 ワード
問題では2つの場所を結ぶ道路が1本より多いかもしれないという.また、これまで問題が戻ってくる必要はなく、あるノードから別のノードへのパスが戻ってくることはありませんでした.この問題では、虫の穴を通って始点を返す問題なので、隣接リストを作成するときに、一方向ではなく双方向を入力します.
したがって、最短パスのリストの1番インデックスを0に初期化する必要はなく、現在のノードの値がINF(無限大)であるか否かを決定する条件をベルマンフォードアルゴリズムに加える必要もない.
adjList[S].append((E,cost))
adjList[E].append((S,cost))
虫穴から他のノードに移動する費用を負の値に格納し、ベルマンフォードを使用します.しかし,出発ノードが特定されていないため,すべてのノードに対してベルマンフォードを実行すればよいと考えられるが,問題は負のループが存在することを確認すれば,どのノードからでも出発できることである.したがって、最短パスのリストの1番インデックスを0に初期化する必要はなく、現在のノードの値がINF(無限大)であるか否かを決定する条件をベルマンフォードアルゴリズムに加える必要もない.
import sys
input = sys.stdin.readline
def bellmanFord():
global isPossible
for i in range(1, N + 1):
for j in range(1, N + 1):
for wei, vec in adjList[j]:
if dist[vec] > wei + dist[j]:
dist[vec] = wei + dist[j]
if i == N:
isPossible = False
T = int(input())
for _ in range(T):
N, M, W = map(int, input().split())
INF = 2147483647
dist = [INF for _ in range(N + 1)]
adjList = [[] for _ in range(N + 1)]
for _ in range(M):
S, E, T = map(int, input().split())
adjList[S].append((T, E))
adjList[E].append((T, S))
for _ in range(W):
S, E, T = map(int, input().split())
adjList[S].append((-T, E))
isPossible = True
bellmanFord()
print("NO" if isPossible else "YES")
Reference
この問題について(1865虫洞-最短距離(ベルマンフォード)), 我々は、より多くの情報をここで見つけました https://velog.io/@changing/1865-웜홀-최단-거리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol