2015 Multi-University Training Contest 3 1011(DFS) Work

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 359    Accepted Submission(s): 255


Problem Description
2015 Multi-University Training Contest 3 1011(DFS)
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. 
 
Input
There are multiple test cases.
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
 
Output
For each test case, output the answer as described above.
 
Sample Input
7 2
1 2
1 3
2 4
2 5
3 6
3 7
 
Sample Output
2
 
Source
 
题意:一个公司有N个人,输入管理的顺序,求管理K个人的管理人员有多少人
分析:暴搜
#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<stdlib.h>
#include<algorithm>
#define LL __int64
using namespace std;
const int MAXN=100+5;
int n,k,cnt,id;
int g[MAXN][MAXN];
int vv[MAXN],cc[MAXN];

int DFS(int cur) 
{
    cc[cur]=0;
    for(int i=1;i<=n;i++)
    {
        if(g[cur][i])
            cc[cur]+=DFS(i);
    }
    if(cc[cur]==k) cnt++;
    return cc[cur]+1;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d %d",&n,&k)!=EOF)
    {
        memset(g,0,sizeof(g));
        memset(cc,0,sizeof(cc));
        memset(vv,0,sizeof(vv));

        for(int i=1;i<n;i++)
        {
            int st,en;
            scanf("%d %d",&st,&en);
            g[st][en]=1;
            vv[en]=1;
        }

        for(int i=1;i<=n;i++)
            if(!vv[i])
            {
                id=i;
                break;
            }            //找出根结点

        cnt=0;
        DFS(id);
        printf("%d
",cnt);
    }
    return 0;
}
View Code