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 ", ans); return 0; }