题解思路:
dp[x]表示以该节点为深度最低点的的路径数,dp[x][0]代表偶数个数,1代表奇数个,那么就可以递归状态转移这个过程。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
typedef long long ll;
ll dp[maxn][3],ans;
int n;
vector<int>vt[maxn];
void dfs(int x,int f)
{
dp[x][0] = 1,dp[x][1] = 0;
for(int i = 0;i < vt[x].size();++i)
{
int v = vt[x][i];
if(v == f) continue;
dfs(v,x);
ans += dp[x][1] * dp[v][0];
ans += dp[x][0] * dp[v][1];
dp[x][0] += dp[v][1];
dp[x][1] += dp[v][0];
}
return ;
}
int main()
{
while(scanf("%d",&n) != EOF)
{
for(int i = 0;i <= n;++i) vt[i].clear();
for(int i = 1;i < n;++i)
{
int x,y;
scanf("%d %d",&x,&y);
vt[x].push_back(y);
vt[y].push_back(x);
}
ans = 0;
dfs(1,-1);
printf("%lld\n",ans);
}
return 0;
}