1 solutions
-
0
题面描述
塔子哥组织了一场小朋友的游戏,需要分发糖果以确保每根绳子的两端至少有一个小朋友开心。每个小朋友可以牵引多个同学,形成树形结构。通过合理分配糖果,目标是用最少的糖果让每个小朋友开心,从而实现快乐的游戏氛围。输入包含小朋友数量及其牵引关系,输出所需的最少糖果数。
思路:树形DP
定义为以为结点的子树中,不放消防栓/放消防栓()的最小个数
如果在第个结点放置消防栓,那么对于结点的所有子节点,都可以放置/不放置消防栓
则有$f[i][1]=\sum_{}^{}min(f[u][0],f[u][1]) (u\in {i|u是i的子节点})$
如果在第个结点不放置消防栓,那么对于结点的所有子节点,都必须要放置消防栓
则有
代码分析
这段代码的目的是在树形结构中找到最优的消防栓放置策略,以最小化需要的消防栓数量。以下是代码的详细分析:
-
变量与数据结构的初始化:
const int N = 1510;
:定义最大节点数为1510。int n;
:小朋友数量,即树的节点数量。vector<vector<int>> g;
:邻接表,用于存储树的结构。int f[N][2];
:动态规划数组,其中f[i][0]
表示不在节点i
放置消防栓时的最小数量,f[i][1]
表示在节点i
放置消防栓时的最小数量。int d[N];
:入度数组,用于记录每个节点的入度,以便找到根节点。
-
深度优先搜索(DFS)函数:
void dfs(int u)
:递归函数,遍历树的节点。- 初始化
f[u][1] = 1
,表示当前节点放置消防栓的数量。 - 初始化
f[u][0] = 0
,表示当前节点不放置消防栓时的数量。 - 对于每个子节点
x
,递归调用dfs(x)
。 - 更新状态转移方程:如果放置消防栓,子节点可以选择放或不放;如果不放,则子节点必须放置。
- 初始化
C++
Java
Python
-
- 1
Information
- ID
- 68
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 39
- Accepted
- 17
- Uploaded By