[これがコードテスト]図論-都市分割計画
7200 ワード
グラフィックアルゴリズム
1.集合するunion:2つの要素を含む集合を1つの集合に結合する演算 find:ある要素が属する集合が何であるかを示す演算 2.神装樹1つのグラフィックを含む場合、すべてのノードを含み、ループが存在しないローカルグラフィック クルーズアルゴリズム(最小拡張ツリーアルゴリズム、階調) 3.位相整列アルゴリズム方向図のすべてのノードを順番にリストし、方向性に反することを避ける 白峻1647号です.
🔗 質問リンク
https://www.acmicpc.net/problem/1647
問題の説明
📝 整理する
接続ノードの幹線を最小限に抑え、周期を持たないには、クルーズアルゴリズムを使用する必要があります.
入力値が多すぎてクイズがタイムアウトした場合は、
1.集合する
🔗 質問リンク
https://www.acmicpc.net/problem/1647
問題の説明
import sys
input = sys.stdin.readline
def find_parent(parent, x):
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
N, M = map(int, input().split())
parent = [0] * (N + 1)
for i in range(1, N + 1):
parent[i] = i
edges = []
result = 0
for _ in range(M):
A, B, C = map(int, input().split())
edges.append((C, A, B))
edges.sort()
# 유지 비용이 가장 큰 경로 없애서 마을 분리
last = 0
for edge in edges:
C, A, B = edge
if find_parent(parent, A) != find_parent(parent, B):
union_parent(parent, A, B)
result += C
last = C
print(result - last)
まず,最小伸長木をクルーズアルゴリズムにより確立した.2つの村を分け、維持費を最小限に抑えるため、村の道路の中で維持費が最も高い道路を廃止した.メンテナンス費用の和を示す結果からソート費用の最後の値を減算し、上記条件を満たす最小メンテナンス費用の和を求める.📝 整理する
接続ノードの幹線を最小限に抑え、周期を持たないには、クルーズアルゴリズムを使用する必要があります.
入力値が多すぎてクイズがタイムアウトした場合は、
import sys / input = sys.std.readline
を使用します.Reference
この問題について([これがコードテスト]図論-都市分割計画), 我々は、より多くの情報をここで見つけました https://velog.io/@xxwb__/이것이-코딩-테스트다-그래프-이론-도시-분할-계획テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol