1、题目链接:http://codeforces.com/contest/350/problem/B
2、去掉所有出度大于一的点,然后搜索即可。
#include<cstdio>
#include<cstring>
using namespace std;
int hotel[100010],fa[100010],od[100010],len,max;
int dfs(int num){
if(fa[num]==0) return len;
len++;
return dfs(fa[num]);
}
void print_ans(int num){
if(fa[num]==0){
printf("%d\n",max);
printf("%d",num);
max--;
if(max) printf(" ");
else printf("\n");
}
else{
print_ans(fa[num]);
printf("%d",num);
max--;
if(max) printf(" ");
else printf("\n");
}
return;
}
int main()
{
//freopen("a.txt","r",stdin);
int n,temp,cnt,maxi;
while(scanf("%d",&n)==1){
memset(od,0,sizeof(od));
memset(fa,0,sizeof(fa));
cnt=0;
for(int i=1;i<=n;i++){
scanf("%d",&temp);
if(temp==1){
hotel[cnt++]=i;
}
}
for(int i=1;i<=n;i++){
scanf("%d",&fa[i]);
od[fa[i]]++;
}
for(int i=1;i<=n;i++){
if(od[fa[i]]>1){
fa[i]=0;
}
}
max=-1;
for(int i=0;i<cnt;i++){
len=1;
temp=dfs(hotel[i]);
if(temp>max){
max=temp;
maxi=hotel[i];
}
}
print_ans(maxi);
}
return 0;
}