DFS集训
2019-07-29
09:01:06
A PARTY
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 nemployees 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
5
-1
1
2
1
-1
3
Note
For the first example, three groups are sufficient, for example:
- Employee 1
- Employees 2 and 4
- Employees 3 and 5
方法一:
#include <bits/stdc++.h> using namespace std; const int maxn = 2010; int father[maxn]; int find_step(int x) { int dep = 0; while(father[x] != x){ x = father[x]; dep++; } return dep; } int main() { int n,x; scanf("%d",&n); for(int i = 1;i <= n;i++){ scanf("%d",&x); if(x == -1) father[i] = i; else father[i] = x; } int sum = 0; for(int i = 1;i <= n;i++){ sum = max(sum,find_step(i)); } // printf("\n%d\n",ans + 1); cout << sum + 1; return 0; }
方法二:
#include<bits/stdc++.h> using namespace std; vector<int>g[3000]; int deep,maxn; int visit[3000]; int a[3000]; void dfs(int x); int main() { int n; cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i]; if(a[i] == -1) continue; g[a[i]].push_back(i); } deep = 1; maxn = 1; memset(visit,0,sizeof(visit)); for(int i = 1; i <= n; i++) { if(a[i] == -1 && visit[i] == 0) //以-1作为树根,深度遍历 { visit[i] = 1; dfs(i); } } cout << maxn << endl; return 0; } void dfs(int x) { for(int i = 0; i < g[x].size(); i++) { int u = g[x][i]; if(visit[u] == 0) { visit[u] = 1; deep++; dfs(u); if(deep > maxn) maxn = deep; deep--; } } }
方法三:
#include<bits/stdc++.h> using namespace std; int f[3000]; int main() { int n; int temp = 0; int ant = 0; cin >> n; for(int i = 1; i <= n; i++) { cin >> f[i]; } for(int i = 1; i <= n; i++) { temp = 0; for(int j = i; j != -1; j = f[j]) { temp++; } ant = max(temp, ant); } cout << ant; return 0; }
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010;
int father[maxn];
int find_step(int x)
{
int dep = 0;
while(father[x] != x){
x = father[x];
dep++;
}
return dep;
}
int main()
{
int n,x;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%d",&x);
if(x == -1)
father[i] = i;
else
father[i] = x;
}
int sum = 0;
for(int i = 1;i <= n;i++){
sum = max(sum,find_step(i));
}
// printf("\n%d\n",ans + 1);
cout << sum + 1;
return 0;
}