这题解法很简单,但思路很难想
对这种题,其实考虑枚举最大值,然后最大值链配对即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5;
int n,cnt=0,head[N];
struct edge{
int link,v;
}q[N<<1];
void put(int u,int v){
q[++cnt].v=v;
q[cnt].link=head[u];
head[u]=cnt;
}
ll ans=0;
ll dp[N];
void dfs(int x){
ll tmp=0;
for(int i=head[x];i;i=q[i].link){
int v=q[i].v;
dp[x]+=(dp[v]+1);
tmp+=(dp[v]+1)*(dp[v]+1);
}
ans+=dp[x]*dp[x]-tmp;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u>v)put(u,v);
else put(v,u);
}
for(int i=2;i<=n;i++){
dfs(i);
}
printf("%lld",ans);
}