codeforces A. Party

题意

公司里有编号1~n的员工,每个员工有一个直接的上级或者没有直接的上级。每个员工和上级的关系评定是这样的:

1.A员工的直接上级是B。2.B的直接上级是C,而A是C的上级,则A也是B的上级。 不存在A的直接上级是B,而B的直接上级是A这种情况。

现在公司组织一个party,party分成了几个团体,每个公司成员都属于一个团体之中,每个团体的评定是团体里的每个成员之间都没有上级和下属的关系。

如今问至少有多少个团体?

原题链接:codeforces.com/problemset/problem/115/A

思路

在刷搜索题里遇见这题,一开始没想用并查集的思想,后来发现在用并查集思想里,题目所给的数据其实已经帮我们完成了合并的操作,接下来其实只用进行查找的操作就行了,但是在查找之前要先处理下合并的数据。 把每个数据看成是下标为1~n的pre[ ]数组的值,然后再把pre[]为 -1 的值改为0,并且pre[0]=0,就得到了完整的合并好的数据,一棵以数组为元素的树就构造好了。然后这棵树的最大深度 - 1 就是最少的团体个数了,至于为什么 我再想想。

code

#include<stdio.h>

int pre[2050];

int Find(int x)
{
    int r=x;
    int Count=0;

    while(pre[r]!=r)
    {
        r=pre[r];
        Count++;
    }

    return Count;
}

int main()
{
    int n;

    while(scanf("%d",&n)!=EOF)
    {
        pre[0]=0;

        for(int i=1;i<=n;i++)
        {
            scanf("%d",&pre[i]);

            if(pre[i]==-1)
            {
                pre[i]=0;
            }
        }

        int MAX=0;
        for(int i=1;i<=n;i++)
        {
            int t;
            t=Find(i);

            if(t>=MAX)
            {
                MAX=t;
            }
        }

        printf("%d\n",MAX);
    }
    return 0;
}

这题很好,让我又能思考(耗费)一下午时间  (-__-)b

猜你喜欢

转载自blog.csdn.net/LaoXiangQ/article/details/84107673