CF 115 A 【求树最大深度/DFS/并查集】

CF
A. Party
time limit per test3 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard 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
inputCopy
5
-1
1
2
1
-1
outputCopy
3
Note
For the first example, three groups are sufficient, for example:

Employee 1
Employees 2 and 4
Employees 3 and 5
【分析】:若是并查集,不要路径压缩,因为要记录深度。输出最大深度即可。

[DFS]

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;
const int mod = 142857;
const int inf = 0x3f3f3f3f;

int n,vis[maxn],cnt,x,ans;
vector<int> G[maxn];

void dfs(int root, int cur)
{
    ans=max(ans,cur);
    for(int i=0;i<G[root].size();i++)
    {
        vis[G[root][i]]=1;
        dfs(G[root][i],cur+1);
    }
}


int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<=n;i++) G[i].clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(x!=-1) G[x].push_back(i);
        }
        ans=0;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                dfs(i,1);
            }
        }
        printf("%d\n",ans);
    }
}

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;
const int mod = 142857;
const int inf = 0x3f3f3f3f;

int n,fa[maxn],cnt,x,ans;
vector<int> G[maxn];

void dfs(int i)
{
    if(i==-1) return;
    else
    {
        x++;
        dfs(fa[i]);
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&fa[i]);
        }
        ans=0;
        for(int i=1;i<=n;i++)
        {
            x=0;
            dfs(i);
            ans=max(ans,x);
        }
        printf("%d\n",ans);
    }
}

[并查集]

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;
const int mod = 142857;
const int inf = 0x3f3f3f3f;

int n,fa[maxn],cnt,x,ans;
vector<int> G[maxn];

void init(int n)
{
    for(int i=1;i<=n;i++)
        fa[i]=i;
}
void Find(int x)
{
    if(x==fa[x])
        return ;
    cnt++;
    Find(fa[x]);
}

void join(int x,int y)
{
    fa[x]=y;
    return;
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(x!=-1)
                join(i,x);
        }
        ans=0;
        for(int i=1;i<=n;i++)
        {
            cnt=0;
            Find(i);
            ans=max(ans,cnt);
        }
        printf("%d\n",ans);
    }
}

posted @ 2018-06-13 01:41  Roni_i  阅读(264)  评论(0编辑  收藏  举报