CF 115A Party

来源:互联网 发布:ps淘宝详情页模板 编辑:程序博客网 时间:2024/05/17 23:40

题目连接:http://codeforces.com/contest/115/problem/A

A. Party
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Examples
input
5-1121-1
output
3
Note

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

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


题目描述:给出n个人的上下级关系,-1表示这个人没有上级,输入的第i个数为j表示i的直接上级是j。这里对上级的定义不仅是直接上级还有间接上级,也就是说满足传递性,A是B的上级,B是C的上级,那么A是C的上级。现在要求把这些人放到集合中,同一集合中不存在集合上下级关系,最少需要多少个集合。

题目分析:将-1的点作为树根,可以构造出森林,从树根遍历每棵树的深度,最大深度就是最后的结果,简单的DFS即可完成。

#include<cstdio>#include<iostream>#include<vector>#include<cstring>using namespace std;int maxx,deep;vector<int>g[2005];int vis[2005],a[2005];void dfs(int x){    for(int i=0;i<g[x].size();i++)    {        int u=g[x][i];        if(!vis[u])        {            vis[u]=1;            deep++;            dfs(u);            if(deep>maxx) maxx=deep;            deep--;        }    }}int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        if(a[i]==-1) continue;        g[a[i]].push_back(i);    }    maxx=1;deep=1;    memset(vis,0,sizeof vis);    for(int i=1;i<=n;i++)    {        if(a[i]==-1&&!vis[i])        {            vis[i]=1;            dfs(i);        }    }    cout<<maxx<<endl;}


0 0
原创粉丝点击