hiho国庆出游
2015-07-12 10:39
495 查看
描述
小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;
}
}
相关文章推荐
- sort和qsort函数的用法
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals(差分约束+spfa 求最长路径)
- 数据结构学什么??
- django with mysql (part-3)
- 【Leetcode】Reverse Integer
- NAO机器人中xx.cpp文件运行遇到问题及其解决办法
- flask_sqlalchemy笔记1
- HTML5 Canvas八大核心技术及其API用法
- Linux内核RCU(Read Copy Update)锁简析
- Linux内核RCU(Read Copy Update)锁简析
- nltk在python中的安装,以及nltk的data库
- E-JSON数据传输标准
- Linux内核RCU(Read Copy Update)锁简析
- Spring web flow——披萨订购流程示例(1)
- HBase使用常见异常
- E-JSON数据传输标准
- 黑马程序员——Java String类 and 正则表达式(第七篇)
- android 定位
- Android:Volley源码解析
- Linux内核RCU(Read Copy Update)锁简析