HDU 5326 Work(求每个人的下属,直接和间接)

题目地址:点击打开链接

思路:刚开始思路就错,只记录了直接的下属,没想到下属的下属也属于老大管,深搜就可以解决,看到大神用并查集也A了,太叼了

AC代码1:

#include<iostream>
#include<cstring>

using namespace std;

int a[110],visit[110],n;

int dfs(int up)
{
    int i,sum = 0;
    for(i=1; i<=n; i++)
    {
        if(a[i] == up)
        {
            sum++;//把小弟算进去
            sum += dfs(i);//把小弟的小弟算进去
        }
    }
    return sum;
}
int main()
{
    int k,i,x,y,sum1;
    while(cin>>n>>k)
    {
        sum1 = 0;
        memset(a,0,sizeof(a));
        for(i=0; i<n-1; i++)
        {
            cin>>x>>y;
            a[y] = x;//y的老大是x
        }
        for(i=1; i<=n; i++)
        {
            if(dfs(i) == k)
                sum1++;
        }
        cout<<sum1<<endl;
    }
    return 0;
}

AC代码2:

#include<iostream>
#include<cstring>

using namespace std;

int head[110],down[110];

void find(int x)
{
    while(head[x] != x)
    {
        down[head[x]]++;
        x = head[x];
    }
}
int main()
{
    int n,k,i,sum1;
    int x,y;
    while(cin>>n>>k)
    {
        memset(down,0,sizeof(down));
        sum1 = 0;
        for(i=1; i<=n; i++)
        {
            head[i] = i;
        }
        for(i=0; i<n-1; i++)
        {
            cin>>x>>y;
            head[y] = x;
        }
        for(i=1; i<=n; i++)
        {
            find(i);
        }
        for(i=1; i<=n; i++)
        {
            if(down[i] == k)
                sum1++;
        }
        cout<<sum1<<endl;
    }
}

大神地址: 点击打开链接

用图的连通表示下属关系很有新意

#include<iostream>
#include<cstring>

using namespace std;

int map[110][110];
int n;

int dfs(int head)
{
    int i,sum = 0;//在这里初始化
    for(i=1; i<=n; i++)
    {
        if(map[head][i])
        {
            sum++;
            sum += dfs(i);
        }
    }
    return sum;
}

int main()
{
    int k,i;
    int x,y,sum1;
    while(cin>>n>>k)
    {
        sum1 = 0;
        memset(map,0,sizeof(map));
        for(i=0; i<n-1; i++)
        {
            cin>>x>>y;
            map[x][y] = 1;
        }
        for(i=1; i<=n; i++)
        {
            //sum = 0;不能在这里初始化sum,会导致一个值加多次
            if(dfs(i) == k)
                sum1++;
        }
        cout<<sum1<<endl;
    }
}
大神地址: 点击打开链接

你可能感兴趣的:(HDU 5326 Work(求每个人的下属,直接和间接))