B3681 子树和
#include <bits/stdc++.h>
using namespace std;
vector < int > a[1005];
bool vis[1005];
int size[1005];
void dfs( int x )
{
vis[x] = 1;
size[x] = 1;
for( int i = 0 ; i < a[x].size() ; i++ )
{
if( vis[ a[x][i] ] == 0 )
{
dfs( a[x][i] );
size[x] += size[ a[x][i] ];
}
}
}
int main()
{
int n;
cin >> n;
for( int i = 2 ; i <= n ; i++ )
{
int u;
cin >> u;
a[i].push_back( u );
a[u].push_back( i );
}
dfs( 1 );
for( int i = 1 ; i <= n ; i++ )
{
cout << size[i] << endl;
}
return 0;
}
P5908 猫猫和企鹅
#include <bits/stdc++.h>
using namespace std;
vector < int > edge[100005];
bool vis[100005];
int dep[100005];
void dfs( int x )
{
vis[x] = 1;
for( int i = 0 ; i < edge[x].size() ; i++ )
{
int y = edge[x][i];
if( vis[y] == 0 )
{
dep[y] = dep[x] + 1;
dfs( y );
}
}
}
int main()
{
int n , d , ans = 0;
cin >> n >> d;
for( int i = 1 ; i < n ; i++ )
{
int u , v;
cin >> u >> v;
edge[u].push_back( v );
edge[v].push_back( u );
}
dfs( 1 );
for( int i = 2 ; i <= n ; i++ )
{
if( dep[i] <= d )
ans++;
}
cout << ans;
return 0;
}