WEEKLY TRAINING2-B Party 树+dfs

来源:互联网 发布:淘宝图片空间满了 编辑:程序博客网 时间:2024/05/17 07:52

Description

A company has n employees numbered from1 to n. Each employee either has no immediate manager or exactly one immediate manager, who is another employee with a different number. An employeeA 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 employeeB
  • Employee B has an immediate manager employeeC 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 employeesA and B such thatA 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 orpi = -1). Everypi denotes the immediate manager for thei-th employee. If pi is -1, that means that thei-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

Input
5-1121-1
Output
3

Sample Output

Hint

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

  • Employee 1
  • Employees 2 and 4
  • Employees 3 and 5 
这道题其实就是给了一片森林,然后求最大的深度,因为题目要求要每一组人都没有父子关系,其实就是没别每棵树的一层取一个人

CODE:
///////////////////////////////////////////////////////// //                                                     ////  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;} 


0 0
原创粉丝点击