간선이 없는 포레스트를 ∅로 쓰자. 포레스트 F와 정점 v에 대하여 F−v를 v에 인접한 모든 간선을 삭제한 포레스트로 정의한다. 정점 자체는 삭제하지 않는다.
정점 v에 있는 따스가 보는 정보는 F−v와 정확히 같다. 특히 자신의 차수가 0인 가능성을 생각하면, 그 가능성에 해당하는 포레스트는 유일하게 F−v이다.
S(F)를 포레스트 F에서 누군가가 처음으로 확신하는 날짜로 정의하고, S(∅)=0으로 둔다. 다다스의 선언 직후에는 빈 포레스트가 가능한 세계에서 제외된다.
실제 포레스트가 F이고 이전 d−1일 동안 모두가 알 수 없다고 선언했다고 하자. 정점 v의 따스가 d일에 확신하려면, 자신의 차수가 0인 세계 가 이전 선언들과 모순이어야 한다. 따라서 다음 점화식이 성립한다.
S(F)=1+v:degF
이 점화식은 최소 정점 커버의 크기와 같다.
포레스트 F의 최소 정점 커버 크기를 τ(F)라고 하자. 간선이 없으면 τ(F)=0이다. 정점 v를 정점 커버에 넣으면 에 인접한 모든 간선이 덮이고, 남은 문제는 의 최소 정점 커버이다. 따라서
τ(F)=1+v:degF
가 성립한다. 위 두 점화식과 초기값이 같으므로 S(F)=τ(F)이다.
이제 주어진 포레스트의 최소 정점 커버 크기를 구하면 된다. 각 트리를 임의의 정점에서 루트가 있는 트리로 만든다. 정점 u의 서브트리에 대하여 다음 DP를 정의한다.
- dp0[u]: u를 선택하지 않을 때 서브트리의 최소 정점 커버 크기
- dp1: 를 선택할 때 서브트리의 최소 정점 커버 크기
자식 w에 대해 다음 전이가 성립한다.
dp0[u]=w∑dp
dp1[u]=1+w
각 연결 요소의 루트 r에서 min(dp0[r],dp1[를 더하면 답을 얻는다.
재귀 DFS는 길이 200000인 경로에서 호출 스택이 넘칠 수 있다. 반복 DFS로 정점 순서를 만든 뒤 역순으로 DP를 계산하는 것이 안전하다.
시간 복잡도는 O(N+M)이고, 공간 복잡도는 O(N+M)이다.
Solution written by GPT5.6