[白俊1956 Python]スポーツ(Gold 4,FloydWarshall)
アルゴリズムタイプ:floyd-walsh(最短パス)
草は参考にならずに自分で解いたのか.△
https://www.acmicpc.net/problem/1956
floyd-walshアルゴリズムで解く場合は、pypy 3をコミットする必要があります.複数のExtraを利用して解答することもでき、より長い時間がかかるので時間の複雑さを比較し、複数のExtraノードの数で実行する必要があるため、2 VelogV、問題の条件下でEの範囲はV^2-V、およそVと3 logVである.フロイド・ウォーシェルはV^3ですが、このように比較すると、もっと長い時間のクローズアップが必要です.
複数に変換してpython 3を通過する解があり、この解は検索で他のブログで参照できます.
まずfloydwashillでAPSPリストを取得する.
たとえば、1~サイクル、2~サイクル、3~サイクルのすべての値を求め、最小値を出力する必要があります.
1の中の周期を求めます.
周期を求める方法は,1から隣接ノードPに移動し,さらに隣接ノードから1までの最短距離値を加算する.
すなわち,1におけるループ値が1を示す隣接ノードはa,b,cである.
1 -> a -> 1
1 -> b -> 1
1 -> c -> 1
これはその中の最高価格です.
この操作は、すべてのノードペアに対してデュアルfor文で実行することで、グラフィック全体の最短サイクルを見つけることができます.
これは,隣接ノードでないノードの最短距離値がINFであればcycle値を更新する際にmin関数を取ることができるため,正しい値が正常に使用できるためである.
勉強するところ、難しいところフロイド・ウォーシェルアルゴリズムが曖昧であるため,概念を再探求した.まだ経験が足りないようです.
草は参考にならずに自分で解いたのか.△
https://www.acmicpc.net/problem/1956
ソースコード(Python)
import sys
import heapq
input = sys.stdin.readline
INF = float('inf')
V, E = map(int, input().split())
APSP = [[INF]*(V+1) for _ in range(V+1)]
for i in range(1, V+1):
APSP[i][i] = 0
for _ in range(E):
a, b, c = map(int, input().split())
APSP[a][b] = c
# 플로이드-워셜 알고리즘
def floyd_warshall():
for mid in range(1, V+1):
for start in range(1, V+1):
for end in range(1, V+1):
cal_dist = APSP[start][mid] + APSP[mid][end]
if cal_dist < APSP[start][end]:
APSP[start][end] = cal_dist
return APSP
APSP = floyd_warshall()
result = INF
# 모든 노드에 대해 최단 사이클 구하기
# 사이클을 구하는 방법은, 예를 들어
# 1에서의 사이클을 구하고 싶다면
# 1의 인접 노드 a, b, c로 이동한 다음
# a, b, c에서 1까지 최단 거리로 이동한다.
# 1 -> a - > 1, 1 -> b -> 1, 1 -> c -> 1
# 이 중 최솟값이 1에서의 최단 사이클이다.
# 이런 식으로 모든 노드들에 대해 수행해주는 것이다.
for c_villege in range(1, V+1):
for adc_villege in range(1, V+1):
if c_villege != adc_villege:
cycle = APSP[c_villege][adc_villege] + APSP[adc_villege][c_villege]
result = min(result, cycle)
if result >= INF:
print(-1)
else:
print(result)
プールの概要floyd-walshアルゴリズムで解く場合は、pypy 3をコミットする必要があります.複数のExtraを利用して解答することもでき、より長い時間がかかるので時間の複雑さを比較し、複数のExtraノードの数で実行する必要があるため、2 VelogV、問題の条件下でEの範囲はV^2-V、およそVと3 logVである.フロイド・ウォーシェルはV^3ですが、このように比較すると、もっと長い時間のクローズアップが必要です.
複数に変換してpython 3を通過する解があり、この解は検索で他のブログで参照できます.
たとえば、1~サイクル、2~サイクル、3~サイクルのすべての値を求め、最小値を出力する必要があります.
1の中の周期を求めます.
周期を求める方法は,1から隣接ノードPに移動し,さらに隣接ノードから1までの最短距離値を加算する.
すなわち,1におけるループ値が1を示す隣接ノードはa,b,cである.
1 -> a -> 1
1 -> b -> 1
1 -> c -> 1
これはその中の最高価格です.
この操作は、すべてのノードペアに対してデュアルfor文で実行することで、グラフィック全体の最短サイクルを見つけることができます.
これは,隣接ノードでないノードの最短距離値がINFであればcycle値を更新する際にmin関数を取ることができるため,正しい値が正常に使用できるためである.
Reference
この問題について([白俊1956 Python]スポーツ(Gold 4,FloydWarshall)), 我々は、より多くの情報をここで見つけました https://velog.io/@ledcost/백준-1956-파이썬-운동-골드-4-플로이드-워셜テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol