HDU 5326 公司人员管理树问题(多校)-简单dp

来源:互联网 发布:程序员数学 编辑:程序博客网 时间:2024/04/30 21:40

题意:给出一个公司的人员管理树,求直接和间接下属共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);}} 



0 0
原创粉丝点击