CodeForces - 350B(反向建图,)
B - Resort
2 seconds
256 megabytes
standard input
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:
- 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!
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.
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.
5
0 0 0 0 1
0 1 2 3 4
5
1 2 3 4 5
5
0 0 1 0 1
0 1 2 2 4
2
4 5
4
1 0 0 0
2 3 4 2
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(反向建图,)的更多相关文章
- poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图
题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...
- HDU 2647 Reward 【拓扑排序反向建图+队列】
题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...
- HUD2647 Reward_反向建图拓扑排序
HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...
- HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)
http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...
- POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】
Silver Cow Party Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Su ...
- HPU 3639--Hawk-and-Chicken【SCC缩点反向建图 && 求传递的最大值】
Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- P 1007 素数对猜想
转跳点:
- P1005 继续(3n+1)猜想
转跳点:
- php.laravel.部署
Laravel 的部署 D 参考laravel-china的做 | 其他参考 | 重要的参考 | Nginx github | 如果想要ssl 啊
- Web安全测试学习笔记 - vulhub环境搭建
Vulhub和DVWA一样,也是开源漏洞靶场,地址:https://github.com/vulhub/vulhub 环境搭建过程如下: 1. 下载和安装Ubuntu 16.04镜像,镜像地址:htt ...
- jQuery原理系列-Dom Ready
ready事件是jquery的一个很重要的功能,在很久很久以前,我们是使用window.onload监听页面加载成功的,onload事件的好处是你不用考虑浏览器兼容性,也不需要依赖任何框架就可以写,但 ...
- 前端安全之 XSS攻击
参看: XSS的原理分析与解剖 前端安全 -- XSS攻击 web大前端开发中一些常见的安全性问题 1.前言 XSS 是面试时,hr提出来给我的,然后大体的浏览一遍,今天才查阅资料大体了解了它. XS ...
- 在spark udf中读取hdfs上的文件
某些场景下,我们在写UDF实现业务逻辑时候,可能需要去读取某个文件. 我们可以将此文件上传个hdfs某个路径下,然后通过hdfs api读取该文件,但是需要注意: UDF中读取文件部分最好放在静态代码 ...
- CentOS下的安装命令 安装Nginx 更新yum源 kali系统当中的软件管理命令(第五天)
Linux下软件的安装:方式:yum/rpm/源码安装YUM安装(帮助管理员解决依赖关系):yum search mysqld 在源中搜索软件包yum install mysql-connector- ...
- no_string_attached笔记
下载附件以后,在终端中查看 第一次调试时发现权限不够 接着,返回文件夹,修改该目标权限 然后进行调试 使用info reg 查看寄存器的值 发现eflags寄存器为0x282,然后x/282 $ea ...
- python matplotlib给图中的点加标签
在写论文用到matplotlib画散点图,想着如果能把每个点对应的ID打在点的旁边就好了,经过一番搜索,最后找到了方法. 首先是打点,先把所有的点画好,举例如下: p1 = ax.scatter(X[ ...
交叉点不能算,所以2忽略,根据0 0 1 0 1, 3,5都是旅馆,均为终点,有3和4,5两条,第二条最长所以选第二个。