ABC394 - F - Alkane
#ABC394
#ABC-F
問題
https://atcoder.jp/contests/abc394/tasks/abc394_f
アルカンとは以下のような化合物。
code:ex.py
H H H
| | |
H-C-C-C-H
| | |
H H H
各頂点を条件を満たすように$ Cか$ Hに決めていくことを考える。
適当に根を決めて木DPをする。頂点$ iの親を$ p_iとする。
$ DP_i:=頂点$ iを根とする部分木であって、$ p_iとつなげばアルカンである($ Cに$ 3個結合している)ものの最大サイズ
ただし便宜上$ Hひとつだけのグラフでも条件を満たすものとする。
根以外の頂点について
子が$ 3つ未満ならそれは$ Hにするしかない。
子が$ 3つならすべてつなげて$ p_iともつなげばアルカンになる。
子が$ 4つ以上なら、子からサイズの大きいものを$ 4つつなげることで$ p_iとつなぐより大きいアルカンになるかもしれない。
DPテーブルとは別に、その頂点での答えを計算する必要があることに注意。
code: f.py
from collections import deque
N = int(input())
G = [[] for _ in range(N)]
for _ in range(N-1):
a, b = map(int, input().split())
a, b = a-1, b-1
Ga.append(b)
Gb.append(a)
ans = -1
for i in range(N):
if len(Gi) < 4: continue
ans = 0
if ans < 0:
print(ans)
exit()
P = -1 * N # Pi はiの親。iが根なら-1
Q = deque(0) # queue。根にするやつを最初に追加
R = [] # トポロジカルソート
while Q:
i = deque.popleft(Q)
R.append(i)
for a in Gi:
if a == Pi: continue
Pa = i
Ga.remove(i) # ☆☆☆
deque.append(Q, a)
ans = 0 * N
DP = 0 * N
for i in R::-1:
if len(Gi) < 3:
ansi = 1
DPi = 1
continue
L = []
for j in Gi:
L.append(DPj)
L.sort(reverse=True)
DPi = 1 + sum(L:3)
if len(L) >= 4:
ansi = 1 + sum(L:4)
elif i != 0:
ansi = 2 + sum(L:3)
print(max(ans))