虽然是树形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]