没有上司的舞会 / 树上求和【树形DP】

本文介绍了如何解决树形结构中的求和问题,通过一道洛谷P1352题目来展示经典解题思路。代码中展示了利用深度优先搜索(DFS)进行节点信息传递和求解最大路径和的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>Link

luogu P1352

ybtoj树上求和


>解题思路

经典例题 划水


>代码

**#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 6010
using namespace std;

struct edge
{
	int to, nxt;
} e[N * 2];
int n, a[N], f[N][5], cnt, h[N];

void dfs (int now, int fath)
{
	for (int i = h[now]; i; i = e[i].nxt)
	{
		int v = e[i].to;
		if (v == fath) continue;
		dfs (v, now);
		f[now][1] += f[v][0];
		f[now][0] += max (f[v][1], f[v][0]);
	}
	f[now][1] += a[now];
}

int main()
{
	int x, y;
	scanf ("%d", &n);
	for (int i = 1; i <= n; i++) scanf ("%d", &a[i]);
	for (int i = 1; i < n; i++)
	{
		scanf ("%d%d", &x, &y);
		e[++cnt] = (edge){y, h[x]}; h[x] = cnt;
		e[++cnt] = (edge){x, h[y]}; h[y] = cnt;
	}
	dfs (1, 0);
	printf ("%d", max (f[1][1], f[1][0]));
	return 0;
}**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值