解题思路:
一条边左边节点个数乘以右边顶点个数等于这条边出现的次数
#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<int> e[100010];
ll n,ans[100010],cnt;
bool vis[100010];
ll dfs(int x)
{
ll t=0;
for(auto c:e[x])
{
if(!vis[c])
{
vis[c]=true;
ll temp=dfs(c)+1;
t+=temp;
ans[++cnt]=temp*(n-temp);
}
}
return t;
}
int main()
{
cin>>n;
for(int i=0;i<n-1;++i)
{
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
vis[1]=true;
dfs(1);
sort(ans+1,ans+n);
long long res=0;
for(int i=1,j=n-1;i<n;++i,--j)
{
res+=ans[i]*j;
}
cout<<res<<endl;
return 0;
}
注意开long long,不开long long后面数据会溢出