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 nemployees 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.

Examples

Input

5
-1
1
2
1
-1

Output

3

Note

For the first example, three groups are sufficient, for example:

  • Employee 1
  • Employees 2 and 4
  • Employees 3 and 5

思路:可以把他们的关系看成一棵树,去寻找树的最大深度,就可以用DSF来找

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define rep(i,n) for(int i=1;i<=N;i++)
using namespace std; int a[2005];
int pre[2005];
int sum;
int DFS(int x)
{
if(pre[x]==x)
{
return x;
}
else
{
sum++;
// cout<<pre[x]<<endl;
return DFS(pre[x]);
}
} int main()
{
int N;
cin>>N;
int i;
rep(i,N)
scanf("%d",&a[i]);
rep(i,N)
pre[i]=i;
rep(i,N)
{
if(a[i]!=-1)
pre[i]=a[i]; else
{
pre[i]=i;
} }
int ans=1;
rep(i,N)
{
sum=1;
DFS(i);
ans=max(ans,sum);
}
cout<<ans<<endl;
return 0;
}

最新文章

  1. jQuery Mobile入门
  2. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
  3. Visual Studio 设置多核编译
  4. codeforces 446B(优先队列)
  5. shell 下的$符合
  6. 手机开发Android模拟器genymotion
  7. 搭建PhoneCat项目的开发与测试环境
  8. 获取执行计划——EXPLAN PLAN
  9. HDU 3201 Build a Fence
  10. 3.Node.js 自定义微信菜单
  11. Webpack 打包之体积优化
  12. webpack教程(六)——分离组件代码
  13. TCP的三次握手与四次挥手
  14. 程序人生 | 35岁以上的 iOS 程序员都到哪里去了?
  15. sql语句可以截取指定字段后面的字符串
  16. git 安装及常见问题处理
  17. [Leetcode]895.最大频率栈
  18. javascript html页面中的内容替换
  19. python字符串拼接
  20. 自动化测试-8.selenium操作元素之键盘和鼠标事件

热门文章

  1. C#高级参数ref的使用
  2. 在IDEA 中用maven创建web项目
  3. session详解&amp;和cookie的区别
  4. go build 命令
  5. JS中的!= 、== 、!==、===的用法和区别
  6. php学习笔记-include
  7. 用fontcreator创建了一个半成品的字体
  8. JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-008Polymorphic many-to-one associations(@ManyToOne、@Inheritance、)
  9. rest-framework组件 之 视图三部曲
  10. java反射中,Class.forName和classloader的区别