牛客 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; }
没有人不辛苦,只有人不喊疼