B - Resort

CodeForces - 350B

B. Resort
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard 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 nobjects (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:

  1. Objects with numbers v1, v2, ..., vk - 1 are mountains and the object with number vk is the hotel.
  2. For any integer i (1 ≤ i < k), there is exactly one ski track leading from object vi. This track goes to object vi + 1.
  3. 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 aiequals 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
input

Copy
5
0 0 0 0 1
0 1 2 3 4
output

Copy
5
1 2 3 4 5
input

Copy
5
0 0 1 0 1
0 1 2 2 4
output

Copy
2
4 5
input

Copy
4
1 0 0 0
2 3 4 2
output

Copy
1
1       读题就读了好长好长时间.
     题意呢,就是:有n个地方,给出n大小的序列a,0代表ai是山地,1代表ai是旅馆,再给出个n大小的序列v,第i的序列表示ai可以冲vi到达,问怎么走才能使路途最长(终点要是旅馆,而且路中途没有分叉)
    
      拿样例二来说
      0 1 2 2 4    就是2连1,3连2,4-2,5-4,画图就是这个样子:
      交叉点不能算,所以2忽略,根据0 0 1 0 1,    3,5都是旅馆,均为终点,有3和4,5两条,第二条最长所以选第二个。
      因为题意终点是旅馆,但我们可以反向建图,从旅馆出发,走下去直到不能再走,比如遇到分岔点或者尽头,这样问题就很清晰了。由于涉及到连接,可以用并查集来存和查找,也是个dfs的过程。
    
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
const int maxn=1e5+;
int a[maxn],b[maxn],fa[maxn];
int ac[maxn];
int dfs(int i)
{
int ans=;      //在以i往下走的过程中,记录步数
while(fa[i]!=-)
{
i=fa[i];
ans++;
}
return ans;
}
int main()
{
int n;
while(cin>>n)
{
memset(fa,-,sizeof(fa));  //边界
map<int,int>mm;
for(int i=;i<=n;i++)
{
cin>>a[i];    //存入节点类型,旅馆或山头
}
for(int i=;i<=n;i++)
{
cin>>b[i];    //存入b【i】,同时计数
mm[b[i]]++;
}
for(int i=;i<=n;i++)
{
if(mm[i]<=) //如果不是分岔点,那么可以表明,i的根节点是b[i]
fa[i]=b[i];  //如果,mm[i]>1,则此为分岔点,fa=-1,也为边界
}
int maxx=-;    //记录最长路径
int k;        //记录最长路径的起始点(旅馆)
for(int i=;i<=n;i++)
{
if(a[i]==)
{
int mid=dfs(i);  //如果是旅馆,以此i跑dfs
if(mid>maxx)
{
maxx=mid;  //记录最大步数,并记录i值
k=i;
}
}
}
cout<<maxx<<endl;
int tot=;
while()
{          //开新数组记录过程,以k为起点,不断跑下去,记录。
ac[tot++]=k;
k=fa[k];  
if(fa[k]==-)  //跑到边界就break;
break;
}
for(int i=tot-;i>=;i--)
cout<<ac[i]<<" ";
cout<<endl;
}
}

好题!妥妥的好题!!!

      

CodeForces - 350B(反向建图,)的更多相关文章

  1. poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

    题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...

  2. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  3. POJ3687——Labeling Balls(反向建图+拓扑排序)

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  4. POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图

    题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...

  5. HDU 2647 Reward 【拓扑排序反向建图+队列】

    题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...

  6. HUD2647 Reward_反向建图拓扑排序

    HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...

  7. HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...

  8. POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】

    Silver Cow Party Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

  9. HPU 3639--Hawk-and-Chicken【SCC缩点反向建图 &amp;&amp; 求传递的最大值】

    Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. 从0开始自己配置一个vps虚拟服务器(1)

    我前几年买的虚拟机都被我荒废了,我已经配置过很多遍了,但是从来没有真的用过.因为我前几个月之前又新买了一个便宜的服务,准备写新的东西.供应商pacificrack,真的很烂,一直断,控制面板还打不开, ...

  2. Golang的基础数据类型-整型

    Golang的基础数据类型-整型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.整型概述 Go语言的整数类型一共有10个. int: 默认是有符号(signed)整形,占用空间 ...

  3. windows 禁用中文输入法(转)

    源博客地址:http://blog.csdn.net/xie1xiao1jun/article/details/17913967 windows 程序禁用中文输入法方法:1.添加windows头文件及 ...

  4. 从PC厂商狠抓粉丝经济看,春天将至?

    10月中旬,市场研究机构IDC发布的全球三季度PC出货量报告显示,第三季度全球个人电脑出货量总计6740万台,比去年同期下降0.9%.似乎这一数据的发布,依旧在证明着PC市场的颓势.但在这样的大背景下 ...

  5. Ajax学习系列——创建XMLHttpRequest对象

    Ajax - 创建XMLHttpRequest对象 首先介绍什么是XMLHttpRequest: XMLHttpRequest是Ajax的基础.中文可以解释为可扩展超文本传输请求.术语缩写为XHR. ...

  6. 031-PHP获取图像信息

    <?php list($width, $height, $type, $attr) = getimagesize("plane.jpg"); echo "宽度为:& ...

  7. 151-PHP nl2br函数(二)

    <?php $str="h\nt\nm\nl"; //定义一个多处换行的字串 echo "未处理前的输出形式:<br />{$str}"; $ ...

  8. Linux-课后练习(第二章命令)20200217-2

  9. BZOJ 3442 学习小组

    题解: 神建图 普通的二分图费用流建完后 添加学生x->t 容量为k-1的边 表示尽量让x参加一个活动,剩下的k-1次机会可以不参加 #include<iostream> #incl ...

  10. C++ STD Gems06

    generate.generate_n.sample.iota #include <iostream> #include <vector> #include <strin ...