题意:给定一个人物关系树,以及起点,从起点开始,每人每分钟只能通知一个人,问最少多少分钟可以通知到所有人。
DFS: 对于每个点,先dfs所有相邻节点(除了调用自己的那个),得到几个答案,
然后排序,依次加上1,2,3,...答案大的加小的数字。 返回加完之后的数中的最大值。
#define FOR(i,n) for(long long (i)=1;(i)<=(n);(i)++)
#define For(i,n) for(long long (i)=0;(i)<(n);(i)++)
using namespace std;
struct ArcNode{
int to;
ArcNode*next;
};
struct Node{
int Dis;
int n;
bool vis;
ArcNode*List;
}node[100001];
void Arc(int from,int to){
ArcNode *temp=new ArcNode;
temp->to=to;
temp->next=node[from].List;
node[from].List=temp;
node[from].n++;
}
void DArc(int from,int to){
Arc(from,to);Arc(to,from);
}
int dfs(int rt){
if(node[rt].n==0) return 0;
int *ans=new int[node[rt].n];
ArcNode*temp=node[rt].List;
int n=0;node[rt].vis=1;
while(temp){
if(!node[temp->to].vis){
ans[n++]=dfs(temp->to);
}
temp=temp->next;
}
sort(ans,ans+n);int ANS=0;
for(int i=0;i<n;i++){
ans[i]+=n-i;
if(ans[i]>ANS) ANS=ans[i];
}
delete []ans;
return ANS;
}
int N;
int main(void)
{
while(cin>>N){
FOR(i,N) node[i].n=-1,node[i].vis=0,node[i].List=NULL;
FOR(i,N){
int a;
while(~scanf("%d",&a)&&a){
DArc(i,a);
}
}
int rt;scanf("%d",&rt);node[rt].n++;
int ANS=dfs(rt);
printf("%d\n",ANS);
}
return 0;
}