#include<bits/stdc++.h>
using namespace std;
struct vla{
vector<int>next;
int son,ans;
}pop[50003];
int n,ans=INT_MAX,ansx=1;
void dfs(int x,int dep){
pop[x].ans=dep;
pop[x].son=1;
for(int i=0;i<pop[x].next.size();i++){
dfs(pop[x].next[i],dep+1);
pop[x].ans+=pop[pop[x].next[i]].ans;
pop[x].son+=pop[pop[x].next[i]].son;
}
}
void dff(int x,int last){
if(x!=1){
last+=n-2*pop[x].son;
pop[x].ans=last;
}
for(int i=0;i<pop[x].next.size();i++){
dff(pop[x].next[i],last);
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
if(x>y)swap(x,y);
pop[x].next.push_back(y);
}
dfs(1,0);
dff(1,pop[1].ans);
for(int i=1;i<=n;i++){
if(ans>pop[i].ans){
ans=pop[i].ans;
ansx=i;
}
cout<<pop[i].ans<<endl;
}
cout<<ansx<<" "<<ans;
return 0;
}
下面是别人发的正确代码
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int n;
struct node{
vector<int>next;//邻接表
int num;//子树包含节点数
int ans=0;
int deep=0;
}a[50005];
bool bj[50005];
void dfs(int now,int deep){
bj[now]=1;
a[now].ans=deep;
a[now].num=1;
for(int i=0;i<a[now].next.size();i++){
int ne=a[now].next[i];
if(bj[ne]==0){
// bj[ne]=1;
dfs(ne,deep+1);
a[now].ans+=a[ne].ans;
a[now].num+=a[ne].num;
}
}
}
void dfs2(int now,int x){
bj[now]=1;
if(now!=1){
int nu=a[now].num;
x+=n-2*nu;
a[now].ans=x;
}
for(int i=0;i<a[now].next.size();i++){
int ne=a[now].next[i];
if(bj[ne]==0){
//bj[ne]=1;
dfs2(ne,x);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++){
int x,y;
cin>>x>>y;
a[x].next.push_back(y);
a[y].next.push_back(x);
}
dfs(1,0);
memset(bj,0,sizeof(bj));
dfs2(1,a[1].ans);
int mib,minx=2147483647;
for(int i=1;i<=n;i++){
if(minx>a[i].ans){
minx=a[i].ans;
mib=i;
}
}
cout<<mib<<" "<<minx;
return 0;
}
为什么错啊,我明明按照别人的代码改了啊? 求dalao解答