WEEKLY TRAINING2-B Party 树+dfs

一家公司有n名员工,每个员工可能没有直接经理或有一个直接经理。公司聚会要求员工分组,同一组内不能存在上下级关系。输入员工数n及每个员工的直接经理编号,求最少需要分成多少组。样例输入显示,至少需要3组来满足条件。
摘要由CSDN通过智能技术生成

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

Input
5
-1
1
2
1
-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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值