您的位置:首页 > 其它

HDU5326多校签到题,搜索子孙节点,

2015-07-31 13:04 288 查看
dfs一发即可:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
vector<int> E
;
int in
, son
;
bool vis
;
void dfs(int u)
{
vis[u] = true;
son[u] = 1;
for(int v: E[u]) {
dfs(v);
son[u] += son[v];
}
}
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int n, k, a, b;
while(scanf("%d%d", &n, &k) == 2) {
memset(vis, false, sizeof(vis));
memset(in, 0, sizeof(in));
for(int i = 0; i < n; i++) {
E[i].clear();
}
for(int i = 1; i < n; i++) {
scanf("%d%d", &a, &b);
assert(1 <= a && a <= n);
assert(1 <= b && b <= n);
a--; b--;
E[a].push_back(b);
in[b]++;
}
int root = -1;
for(int i = 0; i < n; i++) if(!in[i]) {
root = i;
}
assert(root == 0);
dfs(root);
for(int i = 0 ; i < n; i++) if(!vis[i]) {
while(1);
}
int ret = 0;
for(int i = 0; i < n; i++) if(son[i] - 1 == k) {
ret ++;
}
printf("%d\n", ret);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: