PAST1L
https://gyazo.com/622d3e70835a1497220daa46d7958222
考えたこと
30個の頂点を最短コストでつなぐ
5個の補助的な頂点があって、それは繋いでも繋がなくても良い
厄介だな
2^5の「5個の頂点を選ぶかどうか」に関して最小全域木を求める?
頂点を取り除いてコストが改善することはないので大きい方からやってもいいかもだけど、それをやるまでもなく間に合いそう
公式解説
35頂点で辺は10^3ぐらいなので2^5の全パターンで探索しても余裕で間に合う
1WA
code:python
def solve(N, M, LARGE, SMALL):
from math import sqrt
edges = []
for i in range(N):
for j in range(i + 1, N):
d = sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
if c1 != c2:
d *= 10
edges.append((d, i, j))
INF = 9223372036854775807
ret = INF
for subset in range(2 ** M):
for m in range(M):
if subset & (1 << m):
for i in range(N):
d = sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
if c1 != c2:
d *= 10
edges.append((d, i, N + m))
init_unionfind(N + M)
edges.sort()
cost = 0
for d, i, j in edges:
if is_connected(i, j):
continue
unite(i, j)
cost += d
ret = min(ret, cost)
return ret