题目连接:http://codeforces.com/contest/115/problem/A
A company has n employees numbered from 1 to n. Each employee either has no immediate manager or exactly one immediate manager, who is another employee with a different number. An employee A is said to be the superior of another employee B if at least one of the following is true:
- Employee A is the immediate manager of employee B
- Employee B has an immediate manager employee C such that employee A is the superior of employee C.
The company will not have a managerial cycle. That is, there will not exist an employee who is the superior of his/her own immediate manager.
Today the company is going to arrange a party. This involves dividing all n employees into several groups: every employee must belong to exactly one group. Furthermore, within any single group, there must not be two employees A and B such that A is the superior of B.
What is the minimum number of groups that must be formed?
The first line contains integer n (1 ≤ n ≤ 2000) — the number of employees.
The next n lines contain the integers pi (1 ≤ pi ≤ n or pi = -1). Every pi denotes the immediate manager for the i-th employee. If pi is -1, that means that the i-th employee does not have an immediate manager.
It is guaranteed, that no employee will be the immediate manager of him/herself (pi ≠ i). Also, there will be no managerial cycles.
Print a single integer denoting the minimum number of groups that will be formed in the party.
5 -1 1 2 1 -1
3
For the first example, three groups are sufficient, for example:
- Employee 1
- Employees 2 and 4
- Employees 3 and 5
题目描述:给出n个人的上下级关系,-1表示这个人没有上级,输入的第i个数为j表示i的直接上级是j。这里对上级的定义不仅是直接上级还有间接上级,也就是说满足传递性,A是B的上级,B是C的上级,那么A是C的上级。现在要求把这些人放到集合中,同一集合中不存在集合上下级关系,最少需要多少个集合。
题目分析:将-1的点作为树根,可以构造出森林,从树根遍历每棵树的深度,最大深度就是最后的结果,简单的DFS即可完成。
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int maxx,deep;
vector<int>g[2005];
int vis[2005],a[2005];
void dfs(int x)
{
for(int i=0;i<g[x].size();i++)
{
int u=g[x][i];
if(!vis[u])
{
vis[u]=1;
deep++;
dfs(u);
if(deep>maxx) maxx=deep;
deep--;
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==-1) continue;
g[a[i]].push_back(i);
}
maxx=1;deep=1;
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++)
{
if(a[i]==-1&&!vis[i])
{
vis[i]=1;
dfs(i);
}
}
cout<<maxx<<endl;
}