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;

}

}

 

 

0 0