题意
公司里有编号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