DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

hyperopia

返回题目

题解

간선이 없는 포레스트를 ∅\varnothing∅로 쓰자. 포레스트 FFF와 정점 vvv에 대하여 F−vF-vF−v를 vvv에 인접한 모든 간선을 삭제한 포레스트로 정의한다. 정점 자체는 삭제하지 않는다.

정점 vvv에 있는 따스가 보는 정보는 F−vF-vF−v와 정확히 같다. 특히 자신의 차수가 000인 가능성을 생각하면, 그 가능성에 해당하는 포레스트는 유일하게 F−vF-vF−v이다.

S(F)S(F)S(F)를 포레스트 FFF에서 누군가가 처음으로 확신하는 날짜로 정의하고, S(∅)=0S(\varnothing)=0S(∅)=0으로 둔다. 다다스의 선언 직후에는 빈 포레스트가 가능한 세계에서 제외된다.

실제 포레스트가 FFF이고 이전 d−1d-1d−1일 동안 모두가 알 수 없다고 선언했다고 하자. 정점 vvv의 따스가 ddd일에 확신하려면, 자신의 차수가 000인 세계 F−vF-v가 이전 선언들과 모순이어야 한다. 따라서 다음 점화식이 성립한다.

S(F)=1+min⁡v:deg⁡F(v)>0S(F−v)S(F)=1+\min_{v:\deg_F(v)>0} S(F-v)S(F)=1+v:degF​

이 점화식은 최소 정점 커버의 크기와 같다.

포레스트 FFF의 최소 정점 커버 크기를 τ(F)\tau(F)τ(F)라고 하자. 간선이 없으면 τ(F)=0\tau(F)=0τ(F)=0이다. 정점 vvv를 정점 커버에 넣으면 vv에 인접한 모든 간선이 덮이고, 남은 문제는 의 최소 정점 커버이다. 따라서

τ(F)=1+min⁡v:deg⁡F(v)>0τ(F−v)\tau(F)=1+\min_{v:\deg_F(v)>0} \tau(F-v)τ(F)=1+v:degF​

가 성립한다. 위 두 점화식과 초기값이 같으므로 S(F)=τ(F)S(F)=\tau(F)S(F)=τ(F)이다.

이제 주어진 포레스트의 최소 정점 커버 크기를 구하면 된다. 각 트리를 임의의 정점에서 루트가 있는 트리로 만든다. 정점 uuu의 서브트리에 대하여 다음 DP를 정의한다.

  • dp0[u]\mathrm{dp}_0[u]dp0​[u]: uuu를 선택하지 않을 때 서브트리의 최소 정점 커버 크기
  • dp1[u]\mathrm{dp}_1[u]dp1​: 를 선택할 때 서브트리의 최소 정점 커버 크기

자식 www에 대해 다음 전이가 성립한다.

dp0[u]=∑wdp1[w]\mathrm{dp}_0[u]=\sum_w \mathrm{dp}_1[w]dp0​[u]=w∑​dp dp1[u]=1+∑wmin⁡(dp0[w],dp1[w])\mathrm{dp}_1[u]=1+\sum_w \min(\mathrm{dp}_0[w],\mathrm{dp}_1[w])dp1​[u]=1+w

각 연결 요소의 루트 rrr에서 min⁡(dp0[r],dp1[r])\min(\mathrm{dp}_0[r],\mathrm{dp}_1[r])min(dp0​[r],dp1​[를 더하면 답을 얻는다.

재귀 DFS는 길이 200 000200\,000200000인 경로에서 호출 스택이 넘칠 수 있다. 반복 DFS로 정점 순서를 만든 뒤 역순으로 DP를 계산하는 것이 안전하다.

시간 복잡도는 O(N+M)O(N+M)O(N+M)이고, 공간 복잡도는 O(N+M)O(N+M)O(N+M)이다.

Solution written by GPT5.6

F
−
v
(
v
)
>
0
min
​
S
(
F
−
v)
v
F−vF-vF−v
(
v
)
>
0
min
​
τ
(
F
−
v)
[
u
]
uuu
1
​
[
w
]
∑
​
min
(
dp0​
[
w
]
,
dp1​
[
w
])
r
])