题目链接:http://oj.daimayuan.top/course/7/problem/530
之所以放这道题,就是因为想要最优的复杂度来解决。因为数据很大,N^2的做法会TLE.
具体看代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
vector<int>e[N];
int dist[N],pre[N],s[N],f;
inline void dfs(int x){
for(auto y:e[x]){
if(y!=pre[x]){
pre[y]=x;
dist[y]=dist[x]+1;
dfs(y);
}
}
}
inline void Done(int x){
s[x]=1;
for(auto y:e[x]){
if(y!=pre[x]){
pre[y]=x;
Done(y);
s[x]+=s[y];
}
}
}
signed main(){
int n;cin>>n;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
memset(dist,0,sizeof(dist));memset(pre,0,sizeof(pre));
pre[1]=-1;Done(1);
int idx=0,v=1<<30;
for(int i=1;i<=n;i++){
f=0;
for(auto y:e[i]){
if(y!=pre[i]) f=max(f,s[y]);
else f=max(f,n-s[i]);
}
if(v>f) v=f,idx=i;
}
memset(dist,0,sizeof(dist));memset(pre,0,sizeof(pre));
pre[idx]=-1;dfs(idx);
int ans=0;
for(int i=1;i<=n;i++) ans+=dist[i];
cout<<ans;
}