Codeforces 116C - Party(dfs)

n個人,每個人之多有一個上司。“上司”關係具有傳遞性。求最少將人分成多少組,每組中的每個人的上司或者間接上司都不在該組。拿到題就用樹的直徑wa了一炮。。。

正解是有向無環森林的最長路。從每個跟節點dfs,找最長的路就行了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<fstream>
#include<sstream>
#include<cstdlib>
#include<vector>
#include<string>
#include<cstdio>
#include<bitset>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define LL long long
#define PB push_back
#define MP make_pair
using namespace std;

const int maxn = 2222;
int n, x, fa, len, t, vis[maxn];
vector<int> G[maxn];

void dfs(int u, int fa, int now)
{
    len = max(len, now);
    REP(i, G[u].size())
    {
        int v = G[u][i];
        if(v != fa) dfs(v, u, now+1);
    }
}

int main()
{
    scanf("%d", &n);
    x = -1;
    FF(i, 1, n+1)
    {
        scanf("%d", &fa);
        if(fa != -1)
        {
            x = fa;
            G[fa].PB(i);
        }
        else vis[i] = 1;
    }
    int ans = 1;
    FF(i, 1, n+1) if(vis[i])
    {
        len = 0;
        dfs(i, -1, 0);
        ans = max(ans, len + 1);
    }
    printf("%d\n", ans);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章