题目概述
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.
链接
代码
一开始以为是并查集,但是实际上就是树的深度。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 2001;
int n, cnt, ans;
int head[N];
struct edge{
int to, nxt;
}e[N << 2];
inline void add(int u, int v){
e[++cnt] = {v, head[u]};
head[u] = cnt;
}
void dfs(int u, int dep){
ans = max(ans, dep);
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
dfs(v, dep + 1);
}
}
int main(){
scanf("%d", &n);
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
if (x == -1) x = 0;
add(x, i);
}
dfs(0, 0);
printf("%d\n", ans);
return 0;
}