题意:给出一个公司的人员管理树,求直接和间接下属共k人的人有多少。
分析:刚开始一看是树就吓到了,不敢做,后来咬着牙一想,不难啊,G哥说是dp,我用的我也不知道的方法,过了。我的方法就是用vis[i][j]记录i与j的直接隶属关系,然后通过vis[i][j]和vis[j][k]又能找到vis[i][k]的间接隶属关系,a[i]+=a[j],a[i]+=a[k]即可。相信自己。
这是G哥代码:
递归大法要学会用起来
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> #define eps 1e-6 #define LL long long using namespace std; //const int maxn = 100 + 5; //const int INF = 0x3f3f3f3f; int d[105]; vector<int> G[105]; int n, k; int son[105]; int dp(int i) { if(d[i] != -1) return d[i]; d[i] = 0; for(int j = 0; j < G[i].size(); j++) { d[i] += dp(G[i][j])+1; } return d[i]; } int main() { // freopen("input.txt", "r", stdin); while(scanf("%d%d", &n, &k) == 2) { memset(son, 0, sizeof(son)); memset(d, -1, sizeof(d)); for(int i = 1; i <= n; i++) G[i].clear(); for(int i = 0; i < n-1; i++) { int u, v; cin >> u >> v; G[u].push_back(v); } int ans = 0; for(int i = 1; i <= n; i++) { if(dp(i) == k) ans++; } cout << ans << endl; } return 0; }
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int vis[200][200],n,a[200],k; int main() { while(scanf("%d%d",&n,&k)!=EOF){ int p,q; int tot=0; memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); for(int i=1;i<n;i++){ scanf("%d%d",&p,&q); vis[p][q]=1; a[p]++; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(vis[i][j]) for(int k=1;k<=n;k++){ if(vis[j][k]) vis[i][k]=1; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(vis[i][j]) a[i]+=a[j]; } } for(int i=1;i<=n;i++){ if(a[i]==k) tot++; } printf("%d\n",tot); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-02 19:02:31