PTA L2-031 深入虎穴 非dfs的一点想法
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。
内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。
输入格式:
输入首先在一行中给出正整数 N(<),是门的数量。最后 N 行,第 i 行(1)按以下格式描述编号为 i 的那扇门背后能通向的门:
K D[1] D[2] ... D[K]
其中 K 是通道的数量,其后是每扇门的编号。
输出格式:
在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。
输入样例:
13
3 2 3 4
2 5 6
1 7
1 8
1 9
0
2 11 10
1 13
0
0
1 12
0
0
输出样例:
12
注:本方法还未完善,只是提出想法。实际上有最后一个监测点超时
题意:
可看作给出一树上所有子节点父节点之间关系,求从顶到底最深的长度。可以通过模拟构建树的方法做出。
这里我们换一种思路来做。
想法:
易知,最远的房间一定从没有下一个房间的结点中出现。反证,若在有下一个房间结点出现,则下一个结点必定比该节点远。
并且,每个房间的前一个房间已知且唯一,故我们可以记录所有最后一个房间,然后依次找寻每个房间前一个房间,直到没有前一个房间,然后
记录深度。此时最大的深度的房间即为目标门。
以下给出代码:
#include<bits/stdc++.h>
using namespace std;
int pre[]={};//用来标记每个房间的前驱,默认进入是的房间无前驱,即为0。
int main()
{
int n,m,a;
stack<int> b;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&m);
if(m==)b.push(i);//将没有下一个房间的房间存储起来。
else
for(int j=;j<=m;j++){
scanf("%d",&a);
pre[a]=i;
}
}
// for(int i=0;i<=n;i++)cout<<pre[i]<<" ";
// cout<<endl;
// cout<<b.size()<<endl;
int maxi=b.top(),maxx=;
while(b.size())
{
a=b.top();
// cout<<b.top()<<endl;
int sum=;
while(pre[a]!=)
{
sum++;
a=pre[a];
} //求出当前房间的深度
//cout<<sum<<" "<<a<<endl;
if(sum>maxx)
{
maxx=sum;
maxi=b.top();
} //若比前面最深房间深,则更新至当前房间。
b.pop();
sum=;
// cout<<maxi<<endl;
}
printf("%d",maxi);
return ;
}
但这段代码实际上会在最后一个监测点会超时
推测原因:返回时多个不同的房间将相同的路多次返回,如图所示。

解决思路:
从并查集得到的想法。
用struct构建pre数组,记录到上一个的距离,默认为1。
当进行一次返回找顶时,先得到深度,再将每个节点pre直接更新为头部,然后更新该节点深度。这样在第二次使用时省略的
重复路线。
实现效果如图:

{这些想法懒得实现了,有时间再说。}
PTA L2-031 深入虎穴 非dfs的一点想法的更多相关文章
- Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法
原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他 ...
- 【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA BP创建客 ...
- PTA 2-1 列出连通集【DFS+BFS基础】
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...
- 大三CS狗一点想法
本文非技术文 十点半游戏的代码大概完成了1/3,想到今晚提早验收完汇编实验,还是副院长亲自验的,似乎很看好我的样子,然后问我的方向,导师和参加的项目.聊了几句后结束了对话,不禁又引发了我的一些思考. ...
- 2017qcon大会的一点想法(安全人才如何不被淘汰?)
2017 qcon 上海专门设立了“直击黑产,业务安全的攻与防”专题,通过这次专题的了解和学习,让我对黑产的攻防有了更深入认识. 1. 安全防护趋势 2017 qcon 上海专门设立了“直击黑产,业务 ...
- linux 下同步异步,堵塞非堵塞的一些想法
补充: 发现一个更好的解释样例:同步是一件事我们从头到尾尾随着完毕.异步是别人完毕我们仅仅看结果. 堵塞是完毕一件事的过程中可能会遇到一些情况让我们等待(挂起).非堵塞就是发生这些情况时我们跨过. 比 ...
- 关于WEB项目的一点想法
有点失落.迷茫,差点在上班的时候发了火.原因是之前离职的一位同事,在代码里不加注释,而且百般偷懒,致使很多应该的验证没有验证,很多应该考虑到的情况没有考虑.因为是老员工,我相比他来说是新员工.气势上总 ...
- 关于java中用itext导出word的一点想法
这几天在项目组只做了很少的事情,主要还是自己不认真地说.我的部分是要负责用itext导出word文档这一块,之前看到大佬们做出了EXCEL部分觉得很是惊奇,就像刚刚接触HTML一样的感觉.但是毕竟自己 ...
- 关于Knowledge Transfer的一点想法
维基百科中对于Knowledge Transfer(知识转移)的定义是: 知识转移是指分享或传播知识并为解决问题提供投入.在组织理论中,知识转移是将知识从组织的一个部分转移到另一个部分的实践问题. 与 ...
随机推荐
- 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)
作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...
- Bootstrap3.0学习(一)
Bootstrap是Twitter退出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstra ...
- 3022Java_运算
运算 1.运算符分类 算术运算符 二元运算符 +,-,*,/,% 一元运算符 ++,-- 赋值运算符 = 扩展运算符 +=,-=,*=,/= 关系运算符 >,<,>=,<= ...
- ElasticSearch学习(一):ElasticSearch介绍
一.ElasticSearch是什么? ElasticSearch是一款非常强大的.基于Lucene的开源搜索及分析引擎,可以帮助你从海量数据中,快速找到相关的数据信息. 比如,当你在GitHub上搜 ...
- SpringBoot项目多数据源配置
博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507
- Git 所有常用命令
写的很细致,存: https://blog.csdn.net/Mr_Lewis/article/details/85547057
- idea+mvc项目转换小记
经过大家协商,决定还是紧跟时代潮流,把项目转到idea下,并且重新组织项目结构.项目环境原本为myeclipse+maven+springMVC,由于本人提议的boot+cloud变化太大,成本巨大, ...
- Programming In Lua 第二章
1,lua基本类型:nil,boolean,number,string,userdata,function,thread,table.可以用函数type获取变量的类型. 2,lua中的字符串可以用单引 ...
- 用 IQ分布模拟图来测试浏览器的性能
今天天气太凉快,跟这个日历上属于夏天的那一页显得格格不入!就连我我床下那台废弃的ThinkPad,居然也十分透凉气,那外壳连我的体温高都没有,于是,我就开始想一个方法,让我那个废弃的电脑发热,顺便用它 ...
- HDU 6058:Kanade's sum(思维)
题目链接 题意 给出一个n和一个k,求1~n的每个区间的第k大的总和是多少,区间长度小于k的话,贡献为0. 思路 首先有一个关系:当一个数是第k大的时候,前面有x个比它大的数,那么后面就有k-x-1个 ...
