2
不会,8.26看
```
include <stdlib.h>
define N 200010
define M 100010
define mod 998244353
typedef struct GraphNode
{//邻接表节点结构
int vertex;//相邻的顶点
struct GraphNode* next;
} GraphNode;
typedef struct VertexInfo
{
int height;
int inDegree;//入度,用于寻找根节点,根节点入度为 0
GraphNode* adjList;//邻接表,存储该节点的子节点
int dp[2];//动态规划数组,dp[0] 表示不选该节点时的最大快乐指数,
//dp[1] 表示选该节点时的最大快乐指数
} VertexInfo;
int n;//职员数量
int ans;
VertexInfo vertices[6005];//职员的信息
void freeAdjList(GraphNode* node)
{
if (node == NULL) return;
freeAdjList(node->next);
free(node);
}
void dfs(int u)
{
vertices[u].dp[0] = 0;
vertices[u].dp[1] = vertices[u].height;
GraphNode* current = vertices[u].adjList;//获取 u 的邻接表
while (current!= NULL)
{
int v = current->vertex;
dfs(v);//递归处理子节点v计算v 的 dp 值
vertices[u].dp[1] += vertices[v].dp[0];
//如果选u那么子节点v不能选,所以将v不选时的最大快乐指数加到u选时的快乐指数上
vertices[u].dp[0] += (vertices[v].dp[1] > vertices[v].dp[0])? vertices[v].dp[1] : vertices[v].dp[0];
//如果不选u,子节点v可选可不选,取 v选或不选时的较大快乐指数加到u不选时的快乐上
current = current->next;
}
}
void solve()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &vertices[i].height);
}
for (int i = 1; i <= n; i++)
{
int u, v;
scanf("%d %d", &v, &u);
GraphNode* newNode = (GraphNode*)malloc(sizeof(GraphNode));
newNode->vertex = v;
newNode->next = vertices[u].adjList;
vertices[u].adjList = newNode;
vertices[v].inDegree++;
}
int root = 0;
for (int i = 1; i <= n; i++)
{
if (vertices[i].inDegree == 0)
{
root = i;
break;
}
}
dfs(root);
printf("%d\n", (vertices[root].dp[1] > vertices[root].dp[0])? vertices[root].dp[1] : vertices[root].dp[0]);
}
int main()
{
int _ = 1;
while (_--)
{
for (int i = 0; i < 6005; i++)
{
vertices[i].height = 0;
vertices[i].inDegree = 0;
vertices[i].adjList = NULL;
vertices[i].dp[0] = 0;
vertices[i].dp[1] = 0;
}
solve();
for (int i = 1; i <= n; i++)
{
freeAdjList(vertices[i].adjList);
}
}
return 0;
◮:树形动态规划
◮:动态规划的状态定义 笔记P13?
浙公网安备 33010602011771号