版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
计蒜客习题:子树的结点个数
题目
样例
思路
模板题,完全使用课程讲解的代码,只在dfs中加了一句记录自身点的代码。
代码
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int MAX_N=1010;
int n;
struct edge {
int v, next;
} e[MAX_N*MAX_N];
int p[MAX_N], eid;
bool vst[MAX_N];
int cnt[MAX_N];
void init() {
memset(p, -1, sizeof(p));
memset(cnt, 0, sizeof(cnt));
memset(vst, 0, sizeof(vst));
eid = 0;
}
void insert(int u, int v) {
e[eid].v = v;
e[eid].next = p[u];
p[u] = eid++;
}
void dfs(int u) {
vst[u] = true;
bool is_leaf = true;
cnt[u]=1;//记录自己
for (int i = p[u]; i != -1; i = e[i].next) {
int v = e[i].v;
if (!vst[v]) {
dfs(v);
is_leaf = false;
cnt[u] += cnt[v];
}
}
if (is_leaf) {
cnt[u] = 1;
}
}
int main()
{
cin>>n;
init();
for(int i=1;i<n;i++)
{
int a,b;
cin>>a>>b;
insert(a,b);
}
dfs(1);
for(int i=1;i<=n;i++)
if(i==1) cout<<cnt[i];
else cout<<" "<<cnt[i];
return 0;
}