• 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 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
    Copy
    5
    -1
    1
    2
    1
    -1
    output
    Copy
    3
    Note

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

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

    刚开始是没明白题,直接把每个节点拿来暴搜,妥妥TLE。把-1作为头开始搜更有效

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <queue>
    #include <map>
    #include <sstream>
    #include <cstdio>
    #include <cstring>
    #include <numeric>
    #include <cmath>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    using namespace std;
    int n,depth=0;
    vector<int> p,head;
    map<int, vector<int>> mp;
    void dfs(int i,int depth,int &res)
    {
        depth++;
        res = max(depth, res);
        if (mp[i].size() == 0)
        {
            return;
        }
        for (int k = 0; k < mp[i].size(); k++)
        {
            dfs(mp[i][k], depth, res);
        }
    }
    int main()
    {
        cin >> n;
        p.resize(n+1);
        
        for (int i = 1; i < n+1; i++)
        {
            cin >> p[i];
            if (mp.find(i) == mp.end())
            {
                mp[i] = vector<int>();
            }
            if (p[i] != -1)
            {
                if (mp.find(p[i]) == mp.end())
                {
                    mp[p[i]] = vector<int>();
                    mp[p[i]].push_back(i);
                }
                else
                {
                    mp[p[i]].push_back(i);
                }
            }
            else
            {
                head.push_back(i);
            }
        }
        int res = 0;
        for (int i = 0; i <head.size() ; i++)
        {
                dfs(head[i], 0, res);
        }
        cout << res;
        //system("pause");
        return 0;
    }

    贴给别人写的,不用邻接表。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cctype>
    #include <cstdlib>
    #include <set>
    #include <map>
    #include <vector>
    #include <string>
    #include <queue>
    #include <stack>
    #include <cmath>
    #define LL long long
    using namespace std;
    const int INF = 0x3f3f3f3f;
    int n,a[2010],ans,tem;
    void dfs(int u)
    {
        tem++;
        if(a[u]==-1)
            return ;
        dfs(a[u]);
    }
    void solve()
    {
        ans=-INF;
        for(int i=1;i<=n;i++)
        {
            tem=0;
            dfs(i);
            ans=max(ans,tem);
        }
        printf("%d
    ",ans);
    }
    int main()
    {
        while(~scanf("%d",&n))
        {
            for(int i=1;i<=n;i++)
                scanf("%d",a+i);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    ubuntu server编译安装nginx
    XPath具体解释
    windows下安装,配置gcc编译器
    给字符数组赋值的方法
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    MiinCMP1.0 SAE 新浪云版公布, 开源企业站点系统
    Mac下cocos2dx-3.0打包Android时,提示&quot;SimpleAudioEngine.h&quot;not found的解决方法
    GG同步到sqlserver报错一例 Invalid date format
    分布式文件系统
    动画clip仅仅读的解决的方法,以及动画关键帧回调的办法
  • 原文地址:https://www.cnblogs.com/dealer/p/12317173.html
Copyright © 2020-2023  润新知