DP on Trees - Introduction
Authors: Michael Cao, Benjamin Qi
Using subtrees as subproblems.
Focus Problem – read through this problem before continuing!
Tutorial
Resources | |||
---|---|---|---|
CF | |||
Philippines | bad code format |
Pro Tip
Don't just dive into trying to figure out a DP state and transitions -- make some observations if you don't see any obvious DP solution! Also, sometimes a greedy strategy suffices in place of DP.
Solution - Tree Matching
Solution 1
In this problem, we're asked to find the maximum matching of a tree, or the largest set of edges such that no two edges share an endpoint. Let's use DP on trees to do this.
Root the tree at node , allowing us to define the subtree of each node.
Let represent the maximum matching of the subtree of such that we don't take any edges leading to some child of . Similarly, let represent the maximum matching of the subtree of such that we take one edge leading into a child of . Note that we can't take more than one edge leading to a child, because then two edges would share an endpoint.
Taking No Edges
Since we will take no edges to a child of , the children vertices of can all take an edge to some child, or not. Additionally, observe that the children of taking an edge to a child will not prevent other children of from doing the same. In other words, all of the children are independent. So, the transitions are:
Taking One Edge
The case where we take one child edge of is a bit trickier. Let's assume the edge we take is , where . Then, to calculate for the fixed :
In other words, we take the edge , but we can't take any children of in the matching, so we add . Then, to deal with the other children, we add:
Fortunately, since we've calculated already, this expression simplifies to:
Overall, to calculate the transitions for over all possible children :
Warning!
Loop through the children of twice to calculate and separately! You need to know to calculate .
Code
Solution 2 - Greedy
Just keep matching a leaf with the only vertex adjacent to it while possible.
Code
Problems
Easier
Status | Source | Problem Name | Difficulty | Tags | Solution | URL |
---|---|---|---|---|---|---|
AC | Easy | Show TagsTree, DP | ||||
Gold | Easy | Show TagsTree, DP | External Sol | |||
CF | Normal | Show TagsTree, Greedy | Check CF | |||
POI | Normal | |||||
Gold | Hard | Show TagsGreedy | External Sol | |||
POI | Hard | Show TagsFunc Graph | ||||
POI | Hard | Show TagsFunc Graph |
Warning!
Memory limit for "Spies" is very tight.
Harder
These problems are not Gold level. You may wish to return to these once you're in Platinum.
Status | Source | Problem Name | Difficulty | Tags | Solution | URL |
---|---|---|---|---|---|---|
COI | Very Hard | Show TagsDP, Tree | ||||
Plat | Very Hard | Show TagsDP, Tree, Binary Search | External Sol | |||
CF | Very Hard | Show TagsDP, Tree | Check CF | |||
IOI | Insane | Show TagsDP, Tree | External Sol | |||
CSES | Insane | Show TagsTree, Greedy | Show Sketch | |||
Baltic OI | Insane | Show TagsTree, DP |
Module Progress:
Join the USACO Forum!
Stuck on a problem, or don't understand a module? Join the USACO Forum and get help from other competitive programmers!