思路:把出度大于1的点去掉,以每一个hotel为起点搜索找最长路径。
链接:点击打开链接
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int len,fa[100010],sum[100010],maxpath,hotel[100010];
int dfs(int x)
{
if(fa[x]==0)
return len;
len++;
return dfs(fa[x]);
}
void print(int x)
{
if(fa[x]==0)
{
printf("%d\n",maxpath);
printf("%d",x);
maxpath--;
if(maxpath)
printf(" ");
else printf("\n");
}
else
{
print(fa[x]);
printf("%d",x);
maxpath--;
if(maxpath) printf(" ");
else printf("\n");
}
return;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int cnt=0,tmp,maxindex;
memset(sum,0,sizeof(sum));
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++)
{
scanf("%d",&tmp);
if(tmp==1)
hotel[cnt++]=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&fa[i]);
sum[fa[i]]++;
}
for(int i=1;i<=n;i++)
{
if(sum[fa[i]]>1)
fa[i]=0;
}
maxpath=-1;
for(int i=0;i<cnt;i++)
{
len=1;
int h=dfs(hotel[i]);
if(h>maxpath)
{
maxpath=h;
maxindex=hotel[i];
}
}
print(maxindex);
}
return 0;
}