zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    JVM基础(一)—— 运行时内存结构
    SQL if 和 case when查询示例
    SQL分组聚合查询
    My music
    DataX增量同步到ADB ADS时报错
    shell find的用法
    pycharm安装
    在两个库中查找出差异明细
    docker下安装centos
    升级RDS8.0遇到的问题
  • 原文地址:https://www.cnblogs.com/Wise-XiaoWei4/p/13708297.html
Copyright © 2011-2022 走看看