Description
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?
Input
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.
Output
Print a single integer denoting the minimum number of groups that will be formed in the party.
Sample Input
5 -1 1 2 1 -1
3
Sample Output
Hint
For the first example, three groups are sufficient, for example:
- Employee 1
- Employees 2 and 4
- Employees 3 and 5
/
// //
// Created by 吴尔立 //
// Copyright (c) 2015年 吴尔立. All rights reserved. //
/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <stack>
#include <queue>
#include <map>
#include <string>
#include <set>
#include <vector>
#define ll long long;
#define INF 1<<31
#define cir(i,a,b) for (int i=a;i<=b;i++)
#define CIR(j,a,b) for (int j=a;j>=b;j--)
#define CLR(x) memset(x,0,sizeof(x))
using namespace std;
const int maxn=2005;
int n,ans=0;
int pnt[maxn],pre[maxn],head[maxn],cnt=0;
int f[maxn];
void addedge(int u,int v)
{
pnt[cnt]=v;pre[cnt]=head[u];head[u]=cnt++;
}
void dfs(int p,int step)
{
ans=max(ans,step);
for (int i=head[p];i!=-1;i=pre[i])
dfs(pnt[i],step+1);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(head,-1,sizeof(head));
CLR(pre);
CLR(pnt);
CLR(f);
cir(i,1,n)
{
int u;
scanf("%d",&u);
if (u==-1)
f[i]=-1;
else addedge(u,i);
}
cir (i,1,n)
if (f[i]==-1)
dfs(i,1);
printf("%d\n",ans);
}
return 0;
}