您的位置:首页 > 其它

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: