题意:
现在有一个有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; }