7-3 深入虎穴 (25分) pta ds 简单代码 思路 multimap实现树的搭建
7-3 深入虎穴 (25分)
著名的王牌间谍 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
作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
最近数据结构要上机考,在补题的同时思考一些写代码更快的方法
stl自然成了重点关注对象,相对于map的单映射,multimap提供了一对多的映射关系,适合图和树的搭建(个人观点)
这题就用了multimap来搭建树和查找 代码长度大大减小
这题主要有以下难点
建树
这个看起来像图的东西,题目有给出提示,”007 发现不存在两条路通向同一扇门“,说明不存在回路,用树就行了,用图的话也行,找出源点,广度优先搜索,找到最后一个,可以但没必要。
我用的是multimap来实现儿子节点表示。
注意这边有个坑,就是源点不一定为1,要自己去找,否则会错两个点。
找的思路也方便就是遍历一遍,是子节点标记一下,剩下就是源点(根节点
搜索
就用广度优先搜索就可以了(树里面叫层次遍历)
把最后一个节点的值输出就可以了
multimap的使用可百度一下
#include<stdio.h> #include<iostream> #include<map> #include<queue> using namespace std; multimap<int,int> tree; queue<int> que; void level(int n,int x){ multimap<int,int>::iterator iter; que.push(x); while(!que.empty()){ x =que.front(); que.pop(); for(iter = tree.lower_bound(x);iter!=tree.upper_bound(x);iter++){ que.push(iter->second); } } cout<<x; } int main(){ int n,num; cin>>n; int a[n+1]={}; for(int i=1;i<=n;i++) { cin>>num; for(int j=0;j<num;j++){ int temp; cin>>temp; a[temp]= 1; tree.insert(make_pair(i,temp)); } } int root; for(int i=1;i<=n;i++) { if(!a[i])root=i; } level(n,root); return 0; }
代码量少,思路简单,速度一般(狗头