题目:
Description
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 Aand 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.
Sample Input
Input
5 -1 1 2 1 -1
Output
3
这个题目就是给你一个有向无环图,要你求最长路径。
可以用搜索的方法,也可以用并查集。
并查集的方法是,把这个图看成若干颗树,求这些树的深度的最大值。
只需要记录每个节点的father即可得到所有的树。
比如本题:
有2颗树,深度分别为3和1,所以答案是3
代码:
#include<iostream> #include<stdio.h> using namespace std; int fa[2001]; int deep[2001]; int getdeep(int i) { if (deep[i]>0)return deep[i]; if (fa[i] == -1)return 1; deep[i] = getdeep(fa[i]) + 1; return deep[i]; } int main() { int n, r = 0; cin >> n; for (int i = 1; i <= n; i++) { cin >> fa[i]; deep[i] = -1; } for (int i = 1; i <= n; i++)if (r < getdeep(i))r = getdeep(i); cout << r; return 0; }