** 2166 - 子树的大小及深度
**来源: 东方博宜oj oj.czos.cn
*解法一:vector<int> 数组存储树
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n;
vector<int> a[N];
// dep:深度 si:每个节点对应的子树的大小
int dep[N],si[N];
int dfs(int x,int f)
{
si[x]=1; //1表示是自己
dep[x]=dep[f]+1;
for(int i=0;i<a[x].size();i++)
{
if(a[x][i]!=f) si[x]+=dfs(a[x][i],x);
}
return si[x];
}
int main()
{
int x,y;
cin>>n;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
dfs(1,0);
for(int i=1;i<=n;i++) cout<< si[i]<< " "<< dep[i]<<endl;
return 0;
}
*解法二:邻接表存储树
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n;
int k,pre[N],to[N*2],ne[N*2];
int si[N],dep[N];
void add(int x,int y)
{
to[++k]=y;
ne[k]=pre[x];
pre[x]=k;
}
void dfs(int x,int f)
{
si[x]=1;
dep[x]=dep[f]+1;
for(int i=pre[x];i!=0;i=ne[i])
{
if(to[i]!=f)
{
dfs(to[i],x);
si[x]+=si[to[i]];
}
}
}
int main()
{
int x,y;
cin>>n;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++) cout<< si[i]<< " "<< dep[i]<<endl;
return 0;
}