题目:
代码:
1. 小数据量 时间复杂度O()
#include<bits/stdc++.h>
using namespace std;
int pre[100005],dist[100005],cnt,f[100005];
vector<int> edge[100005];
void dfs(int x){
for(auto y:edge[x]){
if(y!=pre[x]){
pre[y]=x;
dist[y]=dist[x]+1;
dfs(y);
}
}
}
void count(int x){
cnt++;
for(auto y:edge[x]){
if(y!=pre[x]){
pre[y]=x;
count(y);
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
for(int i=1;i<=n;i++){
memset(pre,0,sizeof(pre));
f[i]=0;
for(auto x:edge[i]){
cnt=0;
pre[x]=i;
count(x);
f[i]=max(f[i],cnt);
}
}
int inx=1<<30,x=0;
for(int i=1;i<=n;i++){
if(f[i]<inx){
x=i;
inx=f[i];
}
}
memset(pre,0,sizeof(pre));
memset(dist,0,sizeof(dist));
dfs(x);
int ans=0;
for(int i=1;i<=n;i++){
ans+=dist[i];
}
printf("%d",ans);
}
2. 大数据量 时间复杂度O( n )
#include<bits/stdc++.h>
using namespace std;
int pre[100005],dist[100005],cnt,s[100005],f[100005];
vector<int> edge[100005];
void dfs(int x){
for(auto y:edge[x]){
if(y!=pre[x]){
pre[y]=x;
dist[y]=dist[x]+1;
dfs(y);
}
}
}
void solve(int x){
s[x]=1;
for(auto y:edge[x]){
if(y!=pre[x]){
pre[y]=x;
solve(y);
s[x]+=s[y];
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
memset(pre,0,sizeof(pre));
memset(s,0,sizeof(s));
solve(1);
int inx=1<<30,v;
for(int i=1;i<=n;i++){
f[i]=0;
for(auto x:edge[i]){
//这里的pre并不是判断是否成环,而是看以当前i点为根连到目前这条边的方向上连了多 少个节点
if(i!=pre[x]){
f[i]=max(f[i],s[x]);
}else {
f[i]=max(f[i],n-s[i]);
}
}
if(f[i]<inx){
inx=f[i];
v=i;
}
}
memset(pre,0,sizeof(pre));
memset(dist,0,sizeof(dist));
dfs(v);
long long ans=0;
for(int i=1;i<=n;i++){
ans+=dist[i];
}
printf("%d",ans);
return 0;
}