hiho国庆出游
来源:互联网 发布:怎么联系淘宝直播达人 编辑:程序博客网 时间:2024/04/27 11:39
描述
小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的要求。
样例输入
271 21 32 42 53 63 733 7 271 21 32 42 53 63 733 2 7
样例输出
YESNO
我采用图的链表以及深度搜索实现。主要步骤是首先通过find()查找每个节点能访问的所有子树的结点,然后通过DFS()看是否可以按照给定的城市顺序游玩。具体代码如下:
#include<iostream>
#include<bitset>
using namespace std;
int count=0;
int sql=0;
int sq[105];//记录设定的城市顺序
bitset<105> vbit[105];//一个结点能访问所有子树的结点
struct Node
{
int adj;
Node * next;
Node(int a,Node *n)
{
adj=a;
next=n;
}
Node()
{
next=NULL;
}
};
class Graph
{
public:
Node **a;
int n;
Graph(int size)
{
n=size;
a=new Node*[n+1];
for(int i=1;i<=n;i++)
a[i]=NULL;
}
~Graph()
{
Node *p,*q;
for(int i=1;i<=n;i++)
{
p=a[i];
q=p;
while(p)
{
p=p->next;
delete q;
q=p;
}
}
delete []a;
}
void insert(int u,int v)
{
Node *p=new Node(v,a[u]);
a[u]=p;
vbit[u][v]=1;
}
void find(int u,int now)//防止循环,所以设置now ;查找每个节点能访问的所有子树的结点
{
vbit[u][u]=1;
Node *p;
for(p=a[u];p;p=p->next)
{
if(p->adj==now)
continue;
find(p->adj,u);
vbit[u]|=vbit[p->adj];
}
}
void DFS()
{
bool *visited=new bool[n+1];
for(int i=1;i<=n;i++)
visited[i]=false;
DFS(1,visited);
}
void DFS(int v,bool *visited)//深度遍历每棵符合条件的子树
{
visited[v]=true;
if(count<sql&&v==sq[count])
{
count++;
}
if(count==sql)
{
return;
}
Node *p;
while(count<sql)
{
int tmp=count;
for(p=a[v];p;p=p->next)
{
if(vbit[p->adj][sq[count]])
{
if(!visited[p->adj])
{
DFS(p->adj,visited);
}
}
}
if(tmp==count)//返回父节点,找不到对应目标点时
break;
}
}
};
int main()
{
int T,n,a,b,m;
cin>>T;
for(int i=0;i<T;i++)
{
cin>>n;
Graph g(n);
count=0;
for(int p=1;p<=n;p++)
{
vbit[p].reset();
}
for(int j=0;j<n-1;j++)
{
cin>>a>>b;
g.insert(a,b);
}
cin>>m;
sql=m;
for(int k=0;k<m;k++)
{
cin>>sq[k];
}
g.find(1,-1);
g.DFS();
if(count==sql)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
- Hiho 国庆出游
- hiho国庆出游
- hiho #1041 : 国庆出游
- [hiho]#1041 : 国庆出游 树的前序遍历校验
- 国庆出游
- 国庆出游照片
- 1041 : 国庆出游
- hihocoder 1041 国庆出游
- [HihoCoder]#1041 : 国庆出游
- hihoCoder 1041 国庆出游
- 国庆出游 HihoCoder
- Hiho1041 国庆出游 搜索题解
- hihocoder 1041 国庆出游 dfs
- hihocoder#1041之国庆出游
- 程序员专属国庆出游指南!
- 2017国庆出游的意外
- hihocoder #1041 : 国庆出游
- hihocoder #1041 : 国庆出游 (DFS)
- LightOJ 1215 Finding LCM(数论)
- NAO机器人中xx.cpp文件运行遇到问题及其解决办法
- 【Leetcode】Reverse Integer
- sort和qsort函数的用法
- 番茄工作法
- hiho国庆出游
- 数据结构学什么??
- test
- [LeetCode][Java] Longest Valid Parentheses
- 黑马程序员——JAVA基础---常量与变量
- LeetCode #14 Longest Common Prefix
- 利用python3 requests和BeautifulSoup4抓取百度贴吧研究生录取通知书并展示
- WLLN(Weak Law of Large Numbers) DEMO
- 【POJ】 【3624】