• DFS集训


    2019-07-29

    09:01:06

    A PARTY

    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

    方法一:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2010;
    int father[maxn];
     
    int find_step(int x)
    {
        int dep = 0;
        while(father[x] != x){
            x = father[x];
            dep++;
        }
        return dep;
    }
     
    int main()
    {
        int n,x;
        scanf("%d",&n);
        for(int i = 1;i <= n;i++){
            scanf("%d",&x);
            if(x == -1)
                father[i] = i;
            else
                father[i] = x;
        }
        int sum = 0;
        for(int i = 1;i <= n;i++){
            sum = max(sum,find_step(i));
        }
    //    printf("
    %d
    ",ans + 1);
        cout << sum + 1;
        return 0;
    }

    方法二:

    #include<bits/stdc++.h>
    using namespace std;
    vector<int>g[3000];
    int deep,maxn;
    int visit[3000];
    int a[3000];
    
    void dfs(int x);
     
    int main()
    {
        int n;
        cin >> n;
        for(int i = 1; i <= n; i++)
        {
            cin >> a[i];
            if(a[i] == -1) continue;
            g[a[i]].push_back(i);
        }
        deep = 1;
        maxn = 1;
        memset(visit,0,sizeof(visit));
        for(int i = 1; i <= n; i++)
        {
            if(a[i] == -1 && visit[i] == 0) //以-1作为树根,深度遍历 
            {
                visit[i] = 1;
                dfs(i);
            }
        }
        cout << maxn << endl;
        return 0;
    }
    
    void dfs(int x)
    {
        for(int i = 0; i < g[x].size(); i++)
        {
            int u = g[x][i];
            if(visit[u] == 0)
            {
                visit[u] = 1;
                deep++;
                dfs(u);
                if(deep > maxn) maxn = deep;
                deep--;
            }
        }
    }

    方法三:

    #include<bits/stdc++.h>
    using namespace std;
    int f[3000];
    int main()
    {
        int n;
        int temp = 0;
        int ant = 0;
        cin >> n;
        for(int i = 1; i <= n; i++)
        {
            cin >> f[i];
        } 
        for(int i = 1; i <= n; i++)
        {
            temp = 0;
            for(int j = i; j != -1; j = f[j])
            {
                temp++;
            }
            ant = max(temp, ant);
        }
        cout << ant;
        return 0;    
    } 
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2010;
    int father[maxn];
     
    int find_step(int x)
    {
        int dep = 0;
        while(father[x] != x){
            x = father[x];
            dep++;
        }
        return dep;
    }
     
    int main()
    {
        int n,x;
        scanf("%d",&n);
        for(int i = 1;i <= n;i++){
            scanf("%d",&x);
            if(x == -1)
                father[i] = i;
            else
                father[i] = x;
        }
        int sum = 0;
        for(int i = 1;i <= n;i++){
            sum = max(sum,find_step(i));
        }
    //    printf("
    %d
    ",ans + 1);
    	cout << sum + 1;
        return 0;
    }
    
     
  • 相关阅读:
    初步使用redis
    redis配置文件介绍
    windows64位 redis安装 步骤
    敏感词过滤算法
    SpringBoot使用拦截器无效
    linux常用命令
    automation(一)
    JAVA的接口多态
    JAVA的多态(强制转换)
    JAVA的多态
  • 原文地址:https://www.cnblogs.com/Artimis-fightting/p/11261982.html
Copyright © 2020-2023  润新知