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;
}

 

 

 代码量少,思路简单,速度一般(狗头

 

posted on 2020-12-28 11:25  xwwer  阅读(544)  评论(0编辑  收藏  举报