hihoCoder 1041 国庆出游 (DFS)
题意: 小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的要求。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
using namespace std;
#define INF 0x7fffffff
set<int>child[110];
vector<int>adj[110];
int pre[110];
int n,m,s[110],vis[110]; 
void init(){
	int i;
	for(i=1;i<110;i++){
		child[i].clear();
		adj[i].clear();
		pre[i] = 0;
		vis[i] = 0;
	}
}
void dfs1(int x){
	int i,j;
	int d = adj[x].size();
	for(i=0;i<d;i++){
		int t = adj[x][i];
		if(!vis[t]){
			vis[t] = 1;
			pre[t] = x;
			int k = t;
			while(pre[k] > 0){
				child[pre[k]].insert(t);
				k = pre[k];
			}
			dfs1(t);
		}
	}
}
bool dfs2(int x,int p){
	int i,t,d = adj[x].size();
	if(p == x)
	     return true;
	for(i=0;i<d;i++){
		int k = adj[x][i];
		if(!vis[k] ){
			vis[k] = 1;
			if(!dfs2(k,p))
			    vis[k] = 0;
			else
			    return true;
		}
	}
	return false;
}
int main(){
	int i,j,n,T,a,b,now,cnt;
	cin >> T;
	while(T--){
		init();
		scanf("%d",&n);
		for(i=1;i<n;i++){
			scanf("%d%d",&a,&b);
			adj[a].push_back(b);
			adj[b].push_back(a);
		}
		scanf("%d",&m);
		for(i=1;i<=m;i++)
		    scanf("%d",&s[i]);
		vis[1] = 1;
		dfs1(1);
		int ans = 1;
		if(s[1] == 1)
			cnt = 2;
		else
			cnt = 1;
		now = 1;
		memset(vis,0,sizeof(vis));
		vis[1] = 1;
		for( ; cnt <= m ; ){
			if(child[now].find(s[cnt])!=child[now].end()){
				if(!dfs2(now,s[cnt])){
					ans = 0;
					break;
				}
				now = s[cnt++];
			}
			else{
				while(now && child[now].find(s[cnt]) == child[now].end()){
					now = pre[now];
				}
				if(!now){
					ans = false;
					break;
				}
			}
		}
		if(ans)
		    printf("YES\n");
		else
		    printf("NO\n");
	}
	return 0;
}
												
											hihoCoder 1041 国庆出游 (DFS)的更多相关文章
- hihoCoder 1041 国庆出游 最详细的解题报告
		
题目来源:国庆出游 解题思路(下面是大神的写的): 把题目中的序列称作S,树称作T.那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中 ...
 - hihocoder——1041国庆出游(搜索)
		
描述 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发,自驾遍历所 ...
 - hiboCoder 1041  国庆出游  dfs+思维
		
先抽象出一棵以1做为根结点的树.给定了访问序列a[1..m]. 考虑两种特殊情况: 1.访问了某个a[j],但是存在a[i]没有访问且i < j,出现这种情况说明a[j]一定是a[i]的祖先节点 ...
 - 【hihoCoder】1041. 国庆出游
		
问题:详见http://hihocoder.com/problemset/problem/1041 有n个城市,城市编号为1-n,城市间有n-1条路(所以,城市路网是一棵树).给定一个序列S,要求判断 ...
 - 【hiho1041】国庆出游 dfs+bitset
		
题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,现遍历整棵树,要求每条边仅被经过两次,问是否存在一种特定的遍历方式使得 dfs 序中节点的相对前后关系符合给定的顺序. 题解: 首先,由于要 ...
 - Hiho1041 国庆出游 搜索题解
		
题目3 : 国庆出游 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比較有特色:它共同拥有n座城市(编号1-n): ...
 - 国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!
		
摘要:国庆旅游景点人太多,拍出来的照片全是人人人.车车车,该怎么办?不妨试试这个黑科技,让你的出游vlog秒变科幻大片. 本文分享自华为云社区<国庆出游神器,魔幻黑科技换天造物,让vlog秒变科 ...
 - [HIHO1041]国庆出游(DFS, bitset)
		
题目链接:http://hihocoder.com/problemset/problem/1041 学会了用C++的bitset哈,可喜可贺.以后遇到超过64位想用位来表示状态就不愁了哈. 这题用bi ...
 - hiho_1041 国庆出游
		
题目 给定一棵树,N个节点,N - 1条边.给定m个节点,能否找出一种遍历方法,使得首次到达节点ai的时间小于首次到达节点aj的时间(i < j).且经过的路径上的每条边都最多走两遍 分析 我的 ...
 
随机推荐
- bzoj1626[Usaco2007 Dec]Building Roads 修建道路
			
Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农 ...
 - BHO多线程中实现右键菜单
			
在BHO中实现右键菜单网上相关文章很多,可以通过实现IDocHostUIHandler接口的ShowContextMenu.截获HTMLDocumentEvents2的OnContextMenu消息等 ...
 - xdu_RainAndBow 鞍山打铁记
			
我们作为弱校xdu的七队(大四一支,大三四支,大二俩),本来都没指望今年可以出去,结果运气不错,学校得到几个激动名额, 于是我们激动地成功申请到了鞍山站的名额,嗯...可以出去旅游了. 不过我们毕竟太 ...
 - 【剑指offer】面试题37:两个链表的第一个公共结点
			
题目: 输入两个链表,找出它们的第一个公共结点. 思路: 由链表的定义知是单链表.对于单链表,如果两个链表有公共结点,则两个链表必然是像Y型相交.则先计算出各个链表的长度,让长链表的头指针先走多出来的 ...
 - Raid1源代码分析--读流程(重新整理)
			
五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...
 - [转]notifyDataSetChanged() 动态更新ListView
			
有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今 ...
 - [置顶] Android安全机制分析
			
Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...
 - [Javascript] lodash: memoize() to improve the profermence
			
Link: https://lodash.com/docs#memoize Example: .service('UserPresenter', function(UserConstants){ va ...
 - EF中的连接字符串
			
映射视图是每个实体集和关联的映射中指定的可转换的可执行表示. 包括两部分: 查询视图 表示从数据库架构转到概念架构所需的规范装换 更新视图 表示从概念模型转到数据库架构所需的规范转换 如果应用程序仅用 ...
 - JS 图片预览功能
			
<script type="text/javascript"> function DisplayImage(fileTag) { document. ...