NC14248 Treepath
Treepath
http://www.nowcoder.com/questionTerminal/660faba350d74df095191ec3d321c15c
题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
思路:从一点开始dfs求出每个点的深度,分出奇点个数a、偶点个数b,根据奇数深度+奇数深度=偶数深度、偶数深度+偶数深度=偶数深度可以得出答案ans=a(a-1)/2+b(b-1)
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long struct pp{ int to,next; }r[200005]; int head[100005]; int deg[100005]; int cnt; ll a,b; void add(int u,int v) { deg[u]++; r[++cnt].to=v; r[cnt].next=head[u]; head[u]=cnt; } void dfs(int u,int ct,int fa) { if(ct%2) a++; else b++; for(int i=head[u];i;i=r[i].next) { int v=r[i].to; if(v==fa)continue; dfs(v,ct+1,u); } } int main() { int n; scanf("%d",&n); for(int i=0;i<n-1;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } if(n<=2) printf("0\n"); else { dfs(1,1,0); printf("%lld\n",a*(a-1)/2+b*(b-1)/2); } return 0; }