题目链接
解题报告:
从树边的贡献角度考虑,贡献度=树边左边节点总数*右边节点总数
#define first f
#define second s
#define ll long long
#define mp make_pair
#define pb push_back
#define pf push_front
#define lb lower_bound
#define ub upper_bound
#include <bits/stdc++.h>
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
const int MOD=998244353;
const double PI=acos(-1);
const double e=2.718281828459;
struct node
{
int to,next;
}edge[maxn<<1];
int head[maxn],cnt,ant,sz[maxn],n;
ll ma[maxn];
void add(int from,int to)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
void dfs(int now,int pre)
{
sz[now]=1;
for(int i=head[now];~i;i=edge[i].next){
int to=edge[i].to;
if(to==pre){continue;}
dfs(to,now);
sz[now]+=sz[to];
ma[++ant]=1ll*(n-sz[to])*sz[to];
}
}
int main()
{
mem(head,-1);
ant=cnt=0;
int u,v;
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs(1,-1);
sort(ma+1,ma+ant+1,greater<ll>());
ll ans=0;
for(int i=1;i<n;i++){
ans+=1ll*ma[i]*i;
}
printf("%lld\n",ans);
return 0;
}