码迷,mamicode.com
首页 > 其他好文 > 详细

DFS集训

时间:2019-07-29 10:00:03      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:self   fat   other   mini   uil   16px   NPU   can   lib   

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

Input
5
-1
1
2
1
-1
Output
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;
}

 

 

DFS集训

标签:self   fat   other   mini   uil   16px   NPU   can   lib   

原文地址:https://www.cnblogs.com/Artimis-fightting/p/11261982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!