Codeforces Beta Round #87 (Div. 2 Only)-Party(DFS找树的深度)
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;
}
最新文章
- jQuery Mobile入门
- Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
- Visual Studio 设置多核编译
- codeforces 446B(优先队列)
- shell 下的$符合
- 手机开发Android模拟器genymotion
- 搭建PhoneCat项目的开发与测试环境
- 获取执行计划——EXPLAN PLAN
- HDU 3201 Build a Fence
- 3.Node.js 自定义微信菜单
- Webpack 打包之体积优化
- webpack教程(六)——分离组件代码
- TCP的三次握手与四次挥手
- 程序人生 | 35岁以上的 iOS 程序员都到哪里去了?
- sql语句可以截取指定字段后面的字符串
- git 安装及常见问题处理
- [Leetcode]895.最大频率栈
- javascript html页面中的内容替换
- python字符串拼接
- 自动化测试-8.selenium操作元素之键盘和鼠标事件
热门文章
- C#高级参数ref的使用
- 在IDEA 中用maven创建web项目
- session详解&;和cookie的区别
- go build 命令
- JS中的!= 、== 、!==、===的用法和区别
- php学习笔记-include
- 用fontcreator创建了一个半成品的字体
- JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-008Polymorphic many-to-one associations(@ManyToOne、@Inheritance、)
- rest-framework组件 之 视图三部曲
- java反射中,Class.forName和classloader的区别