• 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;
    }
    
  • 相关阅读:
    关于C语言字符串
    进程间通信方式总结
    数据结构(3)-----链表
    Oracle查看用户所在表空间
    oracle linux了解基本命令行
    关于分区技术的索引 index
    oracle闪回表详解
    转:深入学习Oracle分区表及分区索引
    第一章 基本的SQL语句 (SQL基础)
    linux根分区扩容
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781848.html
Copyright © 2020-2023  润新知