题目:给你一下任务以及这些任务的依赖关系,求有最长依赖关系链的任务。
分析:搜索。可以利用dfs或者记忆化搜索。
(因为没有环是树状结构,所以每个根计算时的解就是最终结果,不会被更新)。
说明:每次要清空标记的数组。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int maps[101][101];
int used[101];
int dfs(int s, int n)
{
if (used[s]) return used[s];
int Max = 0;
for (int i = 1 ; i <= n ; ++ i)
if (maps[s][i])
Max = max(Max, dfs(i, n)+1);
return used[s] = Max;
}
int main()
{
int n,m,p;
while (~scanf("%d",&n) && n) {
memset(maps, 0, sizeof(maps));
memset(used, 0, sizeof(used));
for (int i = 1 ; i <= n ; ++ i) {
scanf("%d",&m);
for (int j = 1 ; j <= m ; ++ j) {
scanf("%d",&p);
maps[i][p] = 1;
}
maps[0][i] = 1;
}
dfs(0, n);
int space = 1;
for (int i = 2 ; i <= n ; ++ i)
if (used[space] < used[i])
space = i;
printf("%d\n",space);
}
return 0;
}