[HIHO1041]国庆出游(DFS, bitset)
2016-06-17 11:11
281 查看
题目链接:http://hihocoder.com/problemset/problem/1041
学会了用C++的bitset哈,可喜可贺。以后遇到超过64位想用位来表示状态就不愁了哈。
这题用bitset存从节点1出发开始dfs,某点按照dfs顺序能够到达的所有点的集合。后序更新这个bitset,用或运算把下属的可达节点都更新上来。
先一遍dfs把bitset更新出来,再一遍dfs判断题中所给顺序是否合法。第二遍dfs的时候就按照给定的顺序扫描,根据某一个分支是不是有目标节点来判断退出。
学会了用C++的bitset哈,可喜可贺。以后遇到超过64位想用位来表示状态就不愁了哈。
这题用bitset存从节点1出发开始dfs,某点按照dfs顺序能够到达的所有点的集合。后序更新这个bitset,用或运算把下属的可达节点都更新上来。
先一遍dfs把bitset更新出来,再一遍dfs判断题中所给顺序是否合法。第二遍dfs的时候就按照给定的顺序扫描,根据某一个分支是不是有目标节点来判断退出。
/* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┃┃┃┃┃┃ ┻┻┻┻┻┻ */ #include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <climits> #include <complex> #include <fstream> #include <cassert> #include <cstdio> #include <bitset> #include <vector> #include <deque> #include <queue> #include <stack> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; #define fr first #define sc second #define cl clear #define BUG puts("here!!!") #define W(a) while(a--) #define pb(a) push_back(a) #define Rint(a) scanf("%d", &a) #define Rll(a) scanf("%lld", &a) #define Rs(a) scanf("%s", a) #define Cin(a) cin >> a #define FRead() freopen("in", "r", stdin) #define FWrite() freopen("out", "w", stdout) #define Rep(i, len) for(int i = 0; i < (len); i++) #define For(i, a, len) for(int i = (a); i < (len); i++) #define Cls(a) memset((a), 0, sizeof(a)) #define Clr(a, x) memset((a), (x), sizeof(a)) #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) #define lrt rt << 1 #define rrt rt << 1 | 1 #define pi 3.14159265359 #define RT return #define lowbit(x) x & (-x) #define onenum(x) __builtin_popcount(x) typedef long long LL; typedef long double LD; typedef unsigned long long ULL; typedef pair<int, int> pii; typedef pair<string, int> psi; typedef pair<LL, LL> pll; typedef map<string, int> msi; typedef vector<int> vi; typedef vector<LL> vl; typedef vector<vl> vvl; typedef vector<bool> vb; const int maxn = 110; bitset<maxn> son[maxn]; int n, m, cur; int pos[maxn]; bool vis[maxn]; vi edge[maxn]; bool flag; void dfs1(int u, int p) { son[u][u] = 1; vis[u] = 1; Rep(i, edge[u].size()) { int v = edge[u][i]; if(!vis[v] && p != v) { dfs1(v, u); son[u] |= son[v]; } } } void dfs2(int u, int p) { if(flag) return; if(u == pos[cur]) cur++; if(cur > m) { flag = 1; return; } vis[u] = 1; while(cur <= m) { int tmp = cur; Rep(i, edge[u].size()) { int v = edge[u][i]; if(p != v && son[v][pos[cur]] && !vis[v]) { dfs2(v, u); } } if(tmp == cur) break; } } int main() { // FRead(); int T, u, v; Rint(T); W(T) { Rep(i, n+5) { edge[i].cl(); son[i].reset(); } Cls(vis); flag = 0; cur = 1; Rint(n); Rep(i, n-1) { Rint(u); Rint(v); edge[u].pb(v); edge[v].pb(u); } Rint(m); For(i, 1, m+1) Rint(pos[i]); dfs1(1, -1); Cls(vis); dfs2(1, -1); printf("%s\n", flag ? "YES" : "NO"); } RT 0; }
相关文章推荐
- maven导出项目依赖的jar包(图文)
- Android Application类详解
- 14..jvm
- yolo.c中的函数定义
- 平台消息推送是如何实现的
- 二进制流Url的get传输图片
- MurmurHash PK CityHash
- Session简介
- 怎么解决NiceLabel中出现错误消息1190
- 13..Swing
- 【leetcode】119. Pascal's Triangle II
- ZigBee快速入门
- C# 如何使用 svcutil.exe 创建 WCF 客户端代码
- Hibernate 入门示例
- Java创建线程的两个方法
- 图算法—Problem B
- 12..线程
- 第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC
- android httpClient 支持HTTPS的2种处理方式
- 11..反射