题目链接
B. Resort
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Valera’s finally decided to go on holiday! He packed up and headed for a ski resort.
Valera’s fancied a ski trip but he soon realized that he could get lost in this new place. Somebody gave him a useful hint: the resort has n objects (we will consider the objects indexed in some way by integers from 1 to n), each object is either a hotel or a mountain.
Valera has also found out that the ski resort had multiple ski tracks. Specifically, for each object v, the resort has at most one object u, such that there is a ski track built from object u to object v. We also know that no hotel has got a ski track leading from the hotel to some object.
Valera is afraid of getting lost on the resort. So he wants you to come up with a path he would walk along. The path must consist of objects v1, v2, …, vk (k ≥ 1) and meet the following conditions:
Objects with numbers v1, v2, …, vk - 1 are mountains and the object with number vk is the hotel.
For any integer i (1 ≤ i < k), there is exactly one ski track leading from object vi. This track goes to object vi + 1.
The path contains as many objects as possible (k is maximal).
Help Valera. Find such path that meets all the criteria of our hero!
Input
The first line contains integer n (1 ≤ n ≤ 105) — the number of objects.
The second line contains n space-separated integers type1, type2, …, typen — the types of the objects. If typei equals zero, then the i-th object is the mountain. If typei equals one, then the i-th object is the hotel. It is guaranteed that at least one object is a hotel.
The third line of the input contains n space-separated integers a1, a2, …, an (0 ≤ ai ≤ n) — the description of the ski tracks. If number ai equals zero, then there is no such object v, that has a ski track built from v to i. If number ai doesn’t equal zero, that means that there is a track built from object ai to object i.
Output
In the first line print k — the maximum possible path length for Valera. In the second line print k integers v1, v2, …, vk — the path. If there are multiple solutions, you can print any of them.
Examples
inputCopy
5
0 0 0 0 1
0 1 2 3 4
outputCopy
5
1 2 3 4 5
inputCopy
5
0 0 1 0 1
0 1 2 2 4
outputCopy
2
4 5
inputCopy
4
1 0 0 0
2 3 4 2
outputCopy
1
1
题意:
0 0 1 0 1 第一行n个整数,分别代表第1个顶点一直到第n个顶点是山还是旅馆
0 1 2 2 4 第二行n个整数,分别代表(0 --> 1),(1 --> 2),(2 --> 3),(3 --> 4),(4 --> 5)
求最长的一条路的长度以及路径,这条路不允许有分岔路口,并且这条路的终点必须是旅馆,所以:
2
4 5
思路:
反向建图,从酒店开始往外走,记录最长的路径,如果一个节点可以从多个点到达就说明这个点是岔路口不再往下搜,如果这个点是酒店也停止搜索,没有往下走的路时也停止,所谓的搜索就是遍历。
#include<cmath>
#include<cstdio>
#include<cstring>
const int mmax=100005;
int ss[mmax],map[mmax];
int ok[mmax],ans[mmax];
int path[mmax];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(ok,0,sizeof ok);
for(int i=1;i<=n;i++)
scanf("%d",&ss[i]);
for(int i=1;i<=n;i++)
{
scanf("%d",&map[i]);
ok[map[i]]++; ///记录这个点是否是单条路线的点
}
int anse=0;
for(int i=1;i<=n;i++)
{
if(ss[i]==1)
{
int e=0,t=i;
path[e++]=t;
while(map[t]!=0 && ok[map[t]]<2) ///两个退出条件
{
path[e++]=map[t];
t=map[t];
}
if(e>anse)
{
anse=e;
for(int j=0;j<anse;j++)
ans[j]=path[j];
}
}
}
printf("%d\n",anse);
for(int i=anse-1;i>=0;i--)
printf("%d ",ans[i]);
puts("");
}
return 0;
}