#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. java内存泄漏

    java内存泄漏主要分成两个方面: (1)堆中申请的空间没有被释放 (2)对象已不在被使用,但是仍然存在在内存当中 以下集中情况可能会导致内存泄漏 (1)静态集合的使用hashmap和vector,静 ...

  2. 打印文本中的所有单词,并且打印每个单词出现的行号,非实义单词不考虑(TCPL,练习6-3)

    建立一棵二叉树,每个接单存放单词以及指向一个链表的指针,以及指向左右节点的指针.链表内存放行号以及指向下一个链表节点的指针. 每录入一个单词,先寻找二叉树,再寻找它的链表,分别将单词和行号插入二叉树和 ...

  3. 【原】react-router项目实战

    摘要: react-router相对于flux和redux来说,比较好容易理解一点和容易入门一点.这个是根据我之前的一个项目,然后我用react+react-router+webpack重新写的. 不 ...

  4. Xamarin跨平台移动开发解决方案

    Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单.Xamarin的产品简化了针对多种平台的应用开发,包括iOS.Android.Windows Phone和Mac App.Xam ...

  5. Python札记 -- MongoDB模糊查询

    最近在使用MongoDB的时候,遇到了使用多个关键词进行模糊查询的场景.竹风使用的是mongoengine库. 查了各种资料,最后总结出比较好用的方法.先上代码,后面进行详细说明.如下: #!/usr ...

  6. Jumony快速抓取网页 --- Jumony使用笔记--icode

    作者:郝喜路   个人主页:http://www.cnicode.com      博客地址:http://haoxilu.cnblogs.com    时间:2014年6月26日 19:25:02 ...

  7. java 多线程(synchronized)

    package com.example; public class App { public static void main(String[] args) { doRunable dr = new ...

  8. 解读jQuery中extend函数

    $.extend.apply( null, [ true, { "a" : 1, "b" : 2 } ] );//console.log(window.a); ...

  9. mysql: error while loading shared libraries: libmysqlclient.so.16

    [root@host_41 mysql]# mysqlmysql: error while loading shared libraries: libmysqlclient.so.16: cannot ...

  10. Javascript模块化编程笔记

    最近在读阮一峰的博客http://www.ruanyifeng.com/blog/2012/10/javascript_module.html,随手记录一些重要笔记.  Javascript模块的雏形 ...