zoukankan      html  css  js  c++  java
  • Codeforces 116C. Party 树的深度

    C. 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.

    Sample test(s)
    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

    树的深度即为答案。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    vector<int>a[2222];
    int p[2222]={0};
    int n;
    int deep[2222]={0};
    
    
    void dfs(int i,int d)
    {
        int len=a[i].size();
        deep[i]=d;
        for (int v=0;v<len;v++)
        {
            dfs(a[i][v],d+1);
        }
    }
    
    int main()
    {
        cin>>n;
        for (int i=1;i<=n;i++)
        {
            cin>>p[i];
            if (p[i]!=-1)
            {
                a[p[i]].push_back(i);
            }
        }
        for (int i=1;i<=n;i++)
        {
            if (p[i]==-1)
            {
                dfs(i,1);
            }
        }
        int ans=0;
        for (int i=1;i<=n;i++)
        {
            if (deep[i]>ans)
            {
                ans=deep[i];
            }
        }
        cout<<ans<<endl;
        return 0;
    }





  • 相关阅读:
    【[CQOI2015]选数】
    杜教筛
    【[CQOI2009]跳舞】
    【简单的数学题】
    【[SDOI2013]泉】
    【[AHOI2013]差异】
    【[HEOI2016/TJOI2016]序列】
    【[SDOI2008]Sandy的卡片】
    linux系统编程之信号(一)
    linux系统编程之进程(五)
  • 原文地址:https://www.cnblogs.com/cyendra/p/3038452.html
Copyright © 2011-2022 走看看