MYF

HDU 5326 Work

题目链接

HDU 5326

解题方法:对树进行DFS搜索

题目分析

题目大意

公司里有n个人,只有一个是老板,老板没有上级,别人都有直接或者间接的上级,一个人可以管理他的手下,也可以管理他手下的手下,问,有多少个人恰好管理k个人

解析

先记录好每一个人管理了哪些人,用vis[]标记这些被管理的人,从1~n搜索一遍,找到未被标记的那个人,就是老板了,然后从老板开始往下搜索,对于每一个下属再进行dfs(),如果这个人没有下属了就返回0,如果再往上返回的话就返回1+dfs(now)。很遗憾的被k=0这个情况坑了一个多小时。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Memset(a,val) memset(a,val,sizeof(a))
#define PI acos(-1)
#define rt(n) (j == n ? '\n' : ' ')
#define hi printf("Hi----------\n")
#define debug(x) cout<<"Debug : ---"<<x<<"---"<<endl;
#define eps 1e-8
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;
#define maxn 1000000+5
#define mod 1000000007
vector<int> v[105];
int vis[105];
int n,k,cnt=0;
int dfs(int pos)
{
int sz=v[pos].size();
int ans=0;
for(int i=0;i<sz;i++)
{
int now=v[pos][i];
ans+=1+dfs(now);
}
if(ans==k) cnt++;
return ans;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)
{
v[i].clear();
}
int u,x;
for(int i=1;i<n;i++)
{
cin>>u>>x;
v[u].push_back(x);
vis[x]=1;
}
int rt;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
rt=i;
}
dfs(rt);
cout<<cnt<<endl;
}
}