公式

D - ネットワークの構築 / Network Construction 解説 by sounansya


指定された辺を必ず使う最小全域木を求める問題です。

まず、指定された辺の中でループが存在する場合(つまり、森ではない場合)の答えは \(-1\) です。

それ以外の場合は通常の最小全域木を求めるアルゴリズムと同様の手法で答えを求めることができます。これは、既に繋がれた辺を縮約することで通常の最小全域木を求める問題に帰着させることができるためです。

実装例(Python3)

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)

投稿日時:
最終更新: