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

Posted roni-i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",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
",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
",ans);
    }
}

以上是关于CF 115 A 求树最大深度/DFS/并查集的主要内容,如果未能解决你的问题,请参考以下文章

PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度

复习并查集思想_二叉树最大深度问题_几种做法_并查集/递归/递推/最长路径_多种办法实现

图论:DFS,BFS,邻接链表,并查集

CF878ENumbers on the blackboard 并查集

CodeForces 593D Happy Tree Party [LCA+并查集]

CF553C Love Triangles(带权并查集)