hdu 3534 树形dp+测试数据

博客内容介绍了如何使用树形动态规划(DP)解决求解树中最大路径数量的问题。通过d[i]和g[i]分别记录子节点到节点i的最大和次大距离,以及对应的节点数量。在计算路径数量时,需要对g[i]是否等于d[i]进行分类讨论。文章提供了详细思路及代码,并附带了一组测试数据和答案。
摘要由CSDN通过智能技术生成

虽然是树形dp水题,但是想记录最大路径数量还是想了一下的。

d[i]记录,子节点到i的最大距离

g[i]记录,子节点到i的次大距离(d[i]可能等于g[i])

d_sum[i]记录,有多少个子节点到i的距离等于d[i]

g_sum[i]记录,有多少个子节点到i的距离等于g[i](g[i]==d[i]情况要特殊考虑)

最后计算路径数量时,要注意分类讨论:

1.g[i]!=d[i]

cnt+=d_sum[i]*g_sum[i];

2.g[i]==d[i]

这个有点复杂,看代码吧。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 10010
struct edge{
	int to,len;
};
vector<edge>e[maxn];
ll d[maxn],g[maxn];
ll d_sum[maxn],g_sum[maxn];
int vis[maxn];
void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		e[i].clear();
		vis[i]=0;
	}
}
void T_tree(int u,int h)
{
	vis[u]=h;
	d[u]=0;g[u]=0;
	d_sum[u]=1;g_sum[u]=1;
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].to;
		if(!vis[v])
		{
			T_tree(v,h+1);
			if((d[v]+e[u][i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值