公式
D - ネットワークの構築 / Network Construction 解説
by
D - ネットワークの構築 / Network Construction 解説
by
sounansya
指定された辺を必ず使う最小全域木を求める問題です。
まず、指定された辺の中でループが存在する場合(つまり、森ではない場合)の答えは \(-1\) です。
それ以外の場合は通常の最小全域木を求めるアルゴリズムと同様の手法で答えを求めることができます。これは、既に繋がれた辺を縮約することで通常の最小全域木を求める問題に帰着させることができるためです。
import sys
from atcoder import dsu
input = sys.stdin.readline
n, m, k = map(int, input().split())
edges = []
for _ in range(m):
u, v, w = map(int, input().split())
edges.append((w, u - 1, v - 1))
d = dsu.DSU(n)
e = [False] * m
ans = 0
if k != 0:
for x in list(map(int, input().split())):
e[x - 1] = True
w, u, v = edges[x - 1]
if d.same(u, v):
print(-1)
exit()
d.merge(u, v)
ans += w
edges2 = []
for x in range(m):
if not e[x]:
edges2.append(edges[x])
edges2.sort()
for w, u, v in edges2:
if d.same(u, v):
continue
d.merge(u, v)
ans += w
if d.size(0) != n:
print(-1)
exit()
print(ans)
投稿日時:
最終更新:
