#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include <sstream>
#define INF 1000000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010 using namespace std; bool mk[];
bool vis[];
bool open[]; vector<int> E[];
queue<int> K; int main(){
int t;
cin>>t;
while(t--){
memset(mk,,sizeof(mk));
memset(E,,sizeof(E));
memset(vis,,sizeof(vis));
memset(open,,sizeof(open));
while(!K.empty()) K.pop(); int n,m,k;
cin>>n>>m>>k; for(int i=;i<=k;i++){
int tmp;
cin>>tmp;
} for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
} int L;
cin>>L; for(int i=;i<=L;i++){
int tmp;
cin>>tmp;
mk[tmp]=;
K.push(tmp);
}
if(L<k){
cout<<"No"<<endl;
continue;
} bool ok=; int nt;
int start=K.front(); K.pop(); mk[start]=; vis[start]=;
queue<int> que;
que.push(start);
if(!K.empty()) nt=K.front();
while(!que.empty()){
int cur=que.front(); que.pop();
int siz=E[cur].size();
for(int i=;i<siz;i++){
int v=E[cur][i];
if(!vis[v]&&!mk[v]){
vis[v]=;
que.push(v);
} if(v==nt&&!vis[v]){
vis[v]=;
que.push(v);
mk[v]=;
K.pop();
if(!K.empty()) nt=K.front();
}
else if(!vis[v]&&mk[v])
open[v]=;
} if(que.empty()){
if(open[nt]==&&!vis[nt]){
K.pop();
que.push(nt);
mk[nt]=;
vis[nt]=;
if(!K.empty())
nt=K.front();
}
}
} bool flag=true;
for(int i=; i<=n; ++i)
if(!vis[i]){
flag=false;
break;
}
if(K.empty() && flag) ok=;
if(ok){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
} }
return ; }
 /*
题意: 给定一个n个节点m条边的无向图,接着又给出一个序列(由图中的一些节点所组成)
问能否按照给定序列的顺序来访问图,并且保证图可以访问完毕! 思路:是可以走回头路的搜索!那么我们就按照给定的序列进行搜索,如果当前的节点在给定序列中
出现过,但是访问的顺序和给定序列的顺序不一样,那么就将该节点标记一下open[];
第一次搜索完毕之后,接着从open[]标记的节点(并且该节点符合给定序列的顺序)开始搜索!
最后不要忘记检查图的连通性....
如果不清楚,还是看代码吧....
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 100005
using namespace std; vector<int>g[N];
int vis[N], open[N];
int mk[N], que[N];
int n, m, k, l, cnt;
bool flag; void init(){
memset(vis, , sizeof(vis));
memset(open, , sizeof(open));
memset(mk, , sizeof(mk));
memset(g, , sizeof(g));
} void dfs(int u){
vis[u]=;
open[u]=;
if(u==que[cnt]){
++cnt;
if(cnt>k) flag=true;
}
else if(mk[u])
vis[u]=;
int len=g[u].size();
for(int i=; i<len; ++i){
int v=g[u][i];
if(!vis[v]){
if(mk[v] && v!=que[cnt]){
open[v]=;
continue;
}
if(open[v] && v!=que[cnt])
continue;
dfs(v);
}
}
} int main(){
int t;
scanf("%d", &t);
while(t--){
init();
scanf("%d%d%d", &n, &m, &k);
for(int i=; i<=k; ++i){
int x;
scanf("%d", &x);
mk[x]=;
} while(m--){
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
scanf("%d", &l);
for(int i=; i<=l; ++i)
scanf("%d", &que[i]);
if(l<k){
printf("No\n");
continue;
}
cnt=;
flag=false;
open[que[cnt]]=;
while(cnt<=k){//就是从给定序列节点开始并且open标记开始搜索
if(!open[que[cnt]]) break;//如果访问到给定序列的当前节点没有被open标记,说明
dfs(que[cnt]); //不能按照给定的序列的顺序访问图中的节点
}
if(flag){
int i;
for(i=; i<=n; ++i)
if(!vis[i]) break;
if(i>n)
printf("Yes\n");
else printf("No\n");
}
else
printf("No\n");
}
return ;
}

2014牡丹江网络zoj3816Generalized Palindromic Number(dfs或者bfs)的更多相关文章

  1. ZOJ - 3816 Generalized Palindromic Number dfs

    Generalized Palindromic Number Time Limit: 2 Seconds                                     Memory Limi ...

  2. 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)

    /* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...

  3. [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)

    Generalized Palindromic Number Time Limit: 2 Seconds      Memory Limit: 65536 KB A number that will ...

  4. PAT 甲级 1019 General Palindromic Number(简单题)

    1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  5. General Palindromic Number (进制)

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  6. Palindromic Number (还是大数)

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  7. PAT1019:General Palindromic Number

    1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  8. 1024 Palindromic Number int_string转换 大整数相加

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  9. PAT A1024 Palindromic Number (25 分)——回文,大整数

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

随机推荐

  1. 如何去掉底部的织梦版权信息powered by dedecms

    由于织梦DEDECMS程序6月份的漏洞,很多织梦网站都被黑了,所以大家都在抓紧时间更新系统补丁.但是这次的DEDECMS V5.7版本更新后,在前台网页底部会出现织梦版权信息 “powered by ...

  2. Await, and UI, and deadlocks! Oh my!

    It’s been awesome seeing the level of interest developers have had for the Async CTP and how much us ...

  3. C语言标准定义的32个关键字

    关键字                    意      义 auto                      声明自动变量,缺省时编译器一般默认为auto int                 ...

  4. hibernate常用API详解

    根据个人使用Hibernate的经验,介绍一下Hibernate的多种不同的查询和CUD操作,这些东西在日常开发中非常常用,希望对大家有所帮助. 以下示例均以两张表为例:member和userinfo ...

  5. C++ REST SDK in Visual Studio 2013

    The C++ REST project provides a modern asynchronous C++ API for cloud-based client-server communicat ...

  6. MVC_Controller

    准备工作 安装VS2010或更高版本 安装数据库2008或更高版本 视个人系统不同配置IIS本地服务 数据库和VS下载地址 http://msdn.itellyou.cn/ 本节目标 通过本节案例对M ...

  7. 蛙蛙推荐:AngularJS学习笔记

    为了降低前端代码的数量,提高可维护性,可测试性,学习了下AngularJS,正在准备投入项目开发中. AngularJS的概念比较多,如果面向对象方面的书理解的不透的话学习起来有些费劲,它的官方有个快 ...

  8. Enum是如何用的?

    一.前言 对于枚举Enum,大家都非常熟悉,但枚举出现的场景非常多的时候,是不是可以抽象出一个通用的解决方式.代码大家都会写,但并不是所有人都喜欢写重复的代码,老是用Ctrl+C和Ctrl+V累不累啊 ...

  9. Android 自定义View 三板斧之三——重写View来实现全新控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文来讨论最难的一种 ...

  10. 需要知道关于struct的一些事情

    前言 重构代码的时候,会遇到长参数的方法,此时就需要使用“引入参数对象”来封装这些参数.大多数时候,这些参数都是简单类型,而且所有参数的值占用的空间也不是非常的大,此时使用对象真的好吗?对象的特性是堆 ...