HDU-5326 G.Work
It’s an interesting experience to move from ICPC to work, end my college life and start a brand new journey in company.
As is known to all, every stuff in a company has a title, everyone except the boss has a direct leader, and all the relationship forms a tree. If A’s title is higher than B(A is the direct or indirect leader of B), we call it A manages B.
Now, give you the relation of a company, can you calculate how many people manage k people.
Each test case begins with two integers n and k, n indicates the number of stuff of the company.
Each of the following n-1 lines has two integers A and B, means A is the direct leader of B.
1 <= n <= 100 , 0 <= k < n
1 <= A, B <= n
OutputFor each test case, output the answer as described above.Sample Input
7 2 1 2 1 3 2 4 2 5 3 6 3 7Sample Output
2
大致意思:
n个人之间有上司和下属的关系 一个人的上司也是这个人下属的上司 现在输入每个人之间的关系 问有多少个人的下属个数为k个 显然建个图就可以搞定了 建图后深搜 用cnt数组保存每个人的下属数 最后遍历一下就得到结果了。
#include<bits/stdc++.h>
using namespace std;
vector<int> g[5000];
int cnt[5000];
int dfs(int u){
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
dfs(v);
cnt[u]+=cnt[v];
}
}
int main(){
int n,k,u,v;
while(cin>>n>>k){
for(int i=0;i<n-1;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
}
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++){
cnt[i]=g[i].size();
}
dfs(1);
int sum=0;
for(int i=1;i<=n;i++){
if(cnt[i]==k) sum++;
}
cout<<sum<<endl;
for(int i=1;i<=n;i++) g[i].clear();
}
}