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 分) 并查集判断成环和联通+求树的深度
复习并查集思想_二叉树最大深度问题_几种做法_并查集/递归/递推/最长路径_多种办法实现
CF878ENumbers on the blackboard 并查集