Hdu-5326

题意:

现在有一个有n个人的公司,然后每个人除了boss外都有一个直接领导者,然后如果是直接或间接领导的话,那么都可以说是A管理了B。然后问你有多少个人管理着k个人。

 

解题思路:数据范围小,可以用vector存下来临接关系,然后dfs深度搜索每个节点往下有多少个子节点。

 

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 100;

int vis[1010];
vector<int> E[1020];
int n,k,res;


int dfs(int idx){
    for(int i = 0;i < E[idx].size();i++){
        int u = E[idx][i];
        if(vis[u]) continue;
        res++;
        vis[u] = 1;
        dfs(u);
    }
}


void solve(){
    for(int i = 0;i < 1020;i++) E[i].clear();
    for(int i = 0;i < n - 1;i++){
        int a,b;scanf("%d%d",&a,&b);
        E[a].push_back(b);
    }
    int ans = 0;
    for(int i = 1;i <= n;i++){
        memset(vis,0,sizeof(vis));
        res = 0;
        dfs(i);
        if(res == k) ans++;
    }
    printf("%d\n",ans);
}



int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(~scanf("%d%d",&n,&k)) solve();
    return 0;
}

 

思考:第一时间以为是并查集,但实现起来有点困难,并没有看出来跟我第一遍思路有什么大问题。。。。

 

补坑:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 100;

int pre[202],num[202];
int n,k;



int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(~scanf("%d%d",&n,&k)) {
        memset(num,0,sizeof(num));
        for(int i = 0;i <= n;i++) pre[i] = i;
        for(int i = 1;i < n;i++){
            int x,y;scanf("%d%d",&x,&y);
            pre[y] = x;
        }
        for(int i = 1;i <= n;i++){
            int x = i,cur = i,cnt;
            while(x != pre[x]) x = pre[x];
            while(x != cur){
                cnt = pre[cur];
                num[cnt]++;
                cur = cnt;
            }
        }
        int ans = 0;
        for(int i = 1; i <= n;i++){
            if(num[i] == k) ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2020-09-21 20:19  Wise_4  阅读(151)  评论(0编辑  收藏  举报