国庆出游
时间限制:1000ms
单点时限:1000ms
内存限制:256MB
描述
小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的要求。
- 样例输入
-
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
- 分析:深搜遍历这棵树,如果当前子树下存在当前目标地点,则走到目标地点,否则到其他兄弟子树中找;
- 最后目标地点能全部走完则成立,否则不成立;
- biset可以用来存所有后辈节点;
- 代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include <bitset> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define vi vector<int> #define pii pair<int,int> #define mod 1000000007 #define inf 0x3f3f3f3f #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) const int maxn=1e2+10; const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} int n,m,p[maxn],my_now,vis[maxn]; bool flag; vi a[maxn]; bitset<maxn>son[maxn]; void dfs1(int now,int pre) { son[now][now]=1; for(int x:a[now]) { if(x!=pre) { dfs1(x,now); son[now]|=son[x]; } } } void dfs(int now) { vis[now]=1; if(flag==true)return; if(my_now<m&&p[my_now]==now)my_now++; if(my_now==m){flag=true;return;} while(my_now<m) { int tmp=my_now; for(int x:a[now]) { if(!vis[x]&&son[x][p[my_now]]) { dfs(x); } } if(tmp==my_now)return; } } int main() { int i,j,k,t; scanf("%d",&t); while(t--) { scanf("%d",&n); flag=false;my_now=0; memset(vis,0,sizeof(vis)); rep(i,1,n)son[i].reset(); rep(i,1,n)a[i].clear(); rep(i,1,n-1) { scanf("%d%d",&j,&k); a[j].pb(k),a[k].pb(j); } scanf("%d",&m); rep(i,0,m-1)scanf("%d",&p[i]); dfs1(1,-1); dfs(1); if(flag==true)puts("YES"); else puts("NO"); } //system ("pause"); return 0; }
时间: 2024-10-05 05:24:11