牛客 Treepath(树形dp)

这题只需要考虑奇偶性即可,答案就是到子节点偶数和*到本节点奇数以及子节点奇数和本节点偶数,之后更新数量

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
const int mod=1e9+7;
int h[N],ne[N],e[N],idx;
int depth[N];
int f[N][2];
ll ans;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa){
    f[u][0]=1;
    for(int i=h[u];i!=-1;i=ne[i]){
        int v=e[i];
        if(v==fa)
            continue;
        dfs(v,u);
        ans+=f[u][0]*f[v][1]+f[u][1]*f[v][0];
        f[u][1]+=f[v][0];
        f[u][0]+=f[v][1];
    }
    return ;
}
int main(){
    int n;
    cin>>n;
    int i;
    memset(h,-1,sizeof h);
    for(i=1;i<n;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    dfs(1,-1);
    cout<<ans<<endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12864951.html