解析:
统计每条边在答案中出现的次数
然后从小到大排序,贪心
依次乘上n-1,n-2,n-3,…1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+1000;
vector<int> G[N];
int n,a,b;
int idx;
ll cnt[N];
ll res[N];
void dfs(int u,int fa)
{
cnt[u]=1;
for(int i=0;i<G[u].size();i++)
{
int j=G[u][i];
if(j==fa) continue;
dfs(j,u);
res[idx++]=(ll)cnt[j]*(n-cnt[j]);//乘法原理
cnt[u]+=cnt[j];
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
cin>>a>>b;
G[a].push_back(b);G[b].push_back(a);
}
dfs(1,-1);
sort(res,res+n);
ll ans=0;
for(int i=1;i<n;i++)
{
ans=(ans+(ll)res[i]*(n-i));
}
cout<<ans<<endl;
}