Treepath
Treepath
https://ac.nowcoder.com/acm/problem/14248
树上长度为偶数路径的条数的求法
我们只要找出奇数深度的点的个数跟偶数深度点的个数即可。
奇数深度跑去奇数深度的长度必定为偶数,偶数深度跑去偶数深度的也必定是偶数
于是问题就得解了
dfs求出所有点的深度,设奇数深度点的个数为a,偶数深度点的个数为b
那么答案就是a(a-1)/2+b(b-1)/2
#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define re register #define pb push_back #define fi first #define se second const int N=2e5+10; const int mod7=1e9+7; const int mod=1e9+7; void read(int &a) { a=0;int d=1;char ch; while(ch=getchar(),ch>'9'||ch<'0') if(ch=='-') d=-1; a=ch^48; while(ch=getchar(),ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+(ch^48); a*=d; } void read(ll &a) { a=0;int d=1;char ch; while(ch=getchar(),ch>'9'||ch<'0') if(ch=='-') d=-1; a=ch^48; while(ch=getchar(),ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+(ch^48); a*=d; } vector <int> v[N]; int dep[N]; void dfs(int x,int f) { dep[x]=dep[f]+1; for(auto i:v[x]) { if(i==f) continue; dfs(i,x); } } int main() { int n;read(n); for(re int i=1;i<n;i++) { int x,y; read(x),read(y); v[x].pb(y),v[y].pb(x); } dfs(1,0); int a=0,b=0; for(re int i=1;i<=n;i++) if(dep[i]&1) a++;else b++; ll ans=1ll*a*(a-1)/2+1ll*b*(b-1)/2; printf("%lld\n",ans); return 0; }