[白俊]1238号:パーティーの解答
質問リンク
https://www.acmicpc.net/problem/1238
この問題のラベルは私にとって見慣れない方法なので、まず「多芸」とは何かを学ぶ必要があります.
多芸団とは何ですか.
1つの頂点から別の頂点までの最短距離を探す最短パスアルゴリズム.
このときhipqを用いて,まずその頂点から接続された頂点の中で最も距離の短い経路を計算する.
これにより、計算されたdinパスの長さより長い距離をスキップすることができる.
解き方グラフを使用して、各村間の経路と距離を格納します. ダエストラを使用して、各村から他の村までの最小距離を計算した後、パーティーを行う村に戻る距離を計算します. とは逆に、パーティー村から各村までの最小距離を計算した後、自分の村までの距離に戻る. 村ごとにを繰り返して往復距離(2番+3番)の最大値を求めます. 完全なコード
https://www.acmicpc.net/problem/1238
この問題のラベルは私にとって見慣れない方法なので、まず「多芸」とは何かを学ぶ必要があります.
多芸団とは何ですか.
1つの頂点から別の頂点までの最短距離を探す最短パスアルゴリズム.
このときhipqを用いて,まずその頂点から接続された頂点の中で最も距離の短い経路を計算する.
これにより、計算されたdinパスの長さより長い距離をスキップすることができる.
解き方
from sys import stdin
from sys import maxsize
import heapq
N, M, X = map(int, stdin.readline().split())
graph = {}
for i in range(1, N+1):
graph[i] = []
# 각 마을간의 경로와 거리를 그래프에 저장
for _ in range(M):
start, end, T = map(int, stdin.readline().split())
graph[start].append([end, T])
def dijkstra(i):
queue = []
distance = [maxsize] * (N+1)
# 현재 위치와 이동한 거리 큐, distance에 저장
heapq.heappush(queue, (0, i))
distance[i] = 0
while queue:
# 거리가 짧은 마을의 노드 먼저 계산
dist, village = heapq.heappop(queue)
# 해당 마을의 거리가 이미 최소 거리이면 스킵
if distance[village] < dist:
continue
# 해당 마을에서 연결된 마을들에 대해
for node_village, node_dist in graph[village]:
# 연결된 마을들까지의 거리는 현재 거리 + 해당마을까지의 거리
cost = dist + node_dist
# 연결된 마을까지의 거리보다 cost가 작으면 거리 변경
if distance[node_village] > cost:
distance[node_village] = cost
heapq.heappush(queue, (cost, node_village))
return distance
ans = 0
for i in graph:
if i == X:
continue
# 각 마을에 사는 아이들의 파티 왕복시간 중 최대값 계산
ans = max(dijkstra(i)[X] + dijkstra(X)[i], ans)
print(ans)
Reference
この問題について([白俊]1238号:パーティーの解答), 我々は、より多くの情報をここで見つけました https://velog.io/@hyuntall/백준-1238번-파티-문제-풀이-파이썬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol