Hiho1041 国庆出游 搜索题解
题目3 : 国庆出游
- 例子输入
-
2
7
1 2
1 3
2 4
2 5
3 6
3 7
3
3 7 2
7
1 2
1 3
2 4
2 5
3 6
3 7
3
3 2 7 - 例子输出
-
YES
NO
描写叙述
小Hi和小Ho准备国庆期间去A国旅游。A国的城际交通比較有特色:它共同拥有n座城市(编号1-n);城市之间恰好有n-1条公路相连,形成一个树形公路网。小Hi计划从A国首都(1号城市)出发,自驾遍历全部城市,而且经过每一条公路恰好两次——来回各一次——这样公路两旁的景色都不会错过。
令小Hi苦恼的是他的小伙伴小Ho希望能以某种特定的顺序游历当中m个城市。
比如按3-2-5的顺序游历这3座城市。(详细来讲是要求:第一次到达3号城市比第一次到达2号城市早。而且第一次到达2号城市比第一次到达5号城市早)。
小Hi想知道是否有一种自驾顺序满足小Ho的要求。
输入
输入第一行是一个整数T(1<=T<=20),代表測试数据的数量。
每组数据第一行是一个整数n(1 <= n <= 100),代表城市数目。
之后n-1行每行两个整数a和b (1 <= a, b <= n)。表示ab之间有公路相连。
之后一行包括一个整数m (1 <= m <= n)
最后一行包括m个整数,表示小Ho希望的游历顺序。
输出
YES或者NO,表示是否有一种自驾顺序满足小Ho的要求。
好吧,第一次写hiho的题目,一个新起的oj站点。
这次是微软的预測赛。站点有点偷懒啊,用了曾经的题目拼凑起来的一个比赛。只是眼下站点的题量本来就不多。
本题是第三题,本来应该不难。就是一个深度搜索的题目。
哎。我悲剧了,还是没能按时完毕,最后还是參考了一下网上程序,自己写了个。
看来自己火候还是不够。难怪进不了Google面试,好好继续努力吧。
眼下在找工作。想找技术管理这块工作,真忧虑自己做不成自己想做的东西。
一个不知名的学校真有这么大的不便,令人意想不到啊;经历了,又会认为情理之中,一切都是人性。心态放开点吧。
尽管亚历山大。还是须要继续坚持学习的。
拒了网易运营笔试,拒了聚美什么的笔试,你们要找名校就不要找我玩了。真不想陪你们玩了;面试官的算法题直接被我完美秒杀,连一个小bug你都找不到,都能够拒我的, I服了you!
既然我学校不知名,那我就去小点不那么知名的公司吧,以我的热诚,我相信我能够!
这是一个挺有技巧的深度搜索,须要优化,并且是利用位运算优化。很巧妙。
基本的思想是一个消除查找的思想。就是给出两个集合。求交集的算法的高级应用。
求交集的思想非常easy,就是排序,然后一遍搜索就能够找出了。
这里是在树上求可行的一个序列集合:
加速:这里的getChild函数就是预处理一个节点以下有什么子节点,处理完之后就能够在O(1)的时间内能够推断有没有一个特定的子节点。
然后eliminateAll就是上面说的消除查找思想,代码不长。只是当中有非常多细节点,须要好好认真考究,当中的关键点代码中标注出来了。
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <limits.h>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
using namespace std; const int MAX_N = 101;
vector<int> graAdj[MAX_N];//邻接表
int arr[MAX_N];
int graMat[MAX_N][MAX_N];//矩阵 bitset<MAX_N> hasChild[MAX_N];
void getChild(int u = 1, int par = -1)
{
hasChild[u][u] = 1; //自己是自己的孩子?把自己也并进孩子集合中。
for (int i = 0; i < (int)graAdj[u].size(); i++)
{
int v = graAdj[u][i];
if (v == par) continue;//防止回路,不回走父亲节点
getChild(v, u);
hasChild[u] |= hasChild[v];//巧妙利用bitset加速推断一个节点有多少孩子
}
} //利用全局变量graMat和graAdj
bool eliminatAll(int a[], int &id, int m, int u = 1, int par = -1)
{
if (id < m && a[id] == u) id++;
if (id == m) return true; while (id < m)//关键点,能够循环查找子节点
{
int nexta = a[id];
int curIndex = id;
for (int i = 0; i < (int)graAdj[u].size(); i++)
{
int v = graAdj[u][i];
if (v == par) continue;//排除父节点。防止回路 if (hasChild[v][nexta] && graMat[u][v])
{
graMat[u][v] = 0;//关键点:拆桥。不用反复查找路径
if (eliminatAll(a, id, m, v, u)) return true;
}
}
//关键点:防止无限循环。没有答案的时候退出
if (id == curIndex) break;//没有找到一个相应的点a[id]。返回上一层
}
return false;
} int main()
{
int T, n, a, b, m;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
graAdj[i].clear();
hasChild[i].reset();
}
memset(graMat, 0, sizeof(graMat)); for (int i = 1; i < n; i++)
{
scanf("%d %d", &a, &b);
graAdj[a].push_back(b);
graAdj[b].push_back(a);
graMat[a][b] = graMat[b][a] = 1;
} scanf("%d", &m);
for (int i = 0; i < m; i++)
{
scanf("%d", arr+i);
} getChild(); int id = 0;
if (eliminatAll(arr, id, m)) puts("YES");
else puts("NO");
}
return 0;
}
Hiho1041 国庆出游 搜索题解的更多相关文章
- [HIHO1041]国庆出游(DFS, bitset)
题目链接:http://hihocoder.com/problemset/problem/1041 学会了用C++的bitset哈,可喜可贺.以后遇到超过64位想用位来表示状态就不愁了哈. 这题用bi ...
- hihoCoder 1041 国庆出游 最详细的解题报告
题目来源:国庆出游 解题思路(下面是大神的写的): 把题目中的序列称作S,树称作T.那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中 ...
- 国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!
摘要:国庆旅游景点人太多,拍出来的照片全是人人人.车车车,该怎么办?不妨试试这个黑科技,让你的出游vlog秒变科幻大片. 本文分享自华为云社区<国庆出游神器,魔幻黑科技换天造物,让vlog秒变科 ...
- hihocoder——1041国庆出游(搜索)
描述 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发,自驾遍历所 ...
- 【hiho1041】国庆出游 dfs+bitset
题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,现遍历整棵树,要求每条边仅被经过两次,问是否存在一种特定的遍历方式使得 dfs 序中节点的相对前后关系符合给定的顺序. 题解: 首先,由于要 ...
- HihoCoder1041 国庆出游 树形DP第四题
小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发,自驾遍历所有城市 ...
- [kuangbin带你飞]专题一 简单搜索 题解报告
又重头开始刷kuangbin,有些题用了和以前不一样的思路解决.全部题解如下 点击每道题的标题即可跳转至VJ题目页面. A-棋盘问题 棋子不能摆在相同行和相同列,所以我们可以依此枚举每一行,然后标记每 ...
- hiho_1041 国庆出游
题目 给定一棵树,N个节点,N - 1条边.给定m个节点,能否找出一种遍历方法,使得首次到达节点ai的时间小于首次到达节点aj的时间(i < j).且经过的路径上的每条边都最多走两遍 分析 我的 ...
- hihoCoder 1041 国庆出游 (DFS)
题意: 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发,自驾遍历 ...
随机推荐
- 根据截至日期格式获取倒计时&&时间戳转日期格式
//时间戳转日期格式,传入时间戳必须为数字类型function currentDate(shijianchuo) { var date = new Date(shijianchuo); var y = ...
- jquery ajax 同步异步的执行
jquery ajax 同步异步的执行 大家先看一段简单的jquery ajax 返回值的js 代码 function getReturnAjax{ $.ajax({ type:" ...
- CSU 2018年12月月赛 B 2214: Sequence Magic
Description 有一个1到N的自然数序列1,2,3,...,N-1,N. 我们对它进行M次操作,每次操作将其中连续的一段区间 [Ai,Bi][Ai,Bi] (即第Ai个元素到第Bi个元素之间的 ...
- 笔试算法题(10):深度优先,广度优先以及层序遍历 & 第一个仅出现一次的字符
出题:要求实现层序遍历二元搜索树,并对比BFS与DFS的区别 分析:层序遍历也就是由上至下,从左到右的遍历每一层的节点,类似于BFS的策略,使用Queue可以实现,BFS不能用递归实现(由于每一层都需 ...
- lnmp -memcached使用
系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin Server/Aliyun/Amazon/Mint Linux发行版 需要5GB以上硬盘剩 ...
- 安装nvm 切换nodejs版本
删除已安装的nodejs--------------------------------------------------------------- #查看已经安装在全局的模块,以便删除这些全局模块 ...
- UVA 1596 Bug Hunt (大模拟 栈)
题意: 输入并模拟执行一段程序,输出第一个bug所在的行. 每行程序有两种可能: 数组定义: 格式为arr[size]. 例如a[10]或者b[5],可用下标分别是0-9和0-4.定义之后所有元素均为 ...
- 安装 asp.net core 出错
I received the same error message on a fresh Windows 10 install, with a fresh Visual Studio 2015 ins ...
- <mongoose>……find与findOne的区别……//
mongoose中的 find 和 findOne 都是用来查找指定表的数据的 find指的是查找指定表的所有数据,返回的是数组 User.find().then((result)=>{ con ...
- GitHub总结
1) 工作原理 2) 工作流程 clone资源到本地 更新本地资源 新增或修改clone的资源 查看状态 资源推送回github