2014牡丹江网络zoj3816Generalized Palindromic Number(dfs或者bfs)
#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)的更多相关文章
- ZOJ - 3816 Generalized Palindromic Number dfs
Generalized Palindromic Number Time Limit: 2 Seconds Memory Limi ...
- 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
Generalized Palindromic Number Time Limit: 2 Seconds Memory Limit: 65536 KB A number that will ...
- PAT 甲级 1019 General Palindromic Number(简单题)
1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- General Palindromic Number (进制)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- Palindromic Number (还是大数)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- PAT1019:General Palindromic Number
1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- 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 ...
- 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 ...
随机推荐
- js获取select标签选中的值
<p> 城市: <select id="Select1" name="D1"> &l ...
- RHEL6.5 删除桌面启动器(计算机/Home/回收站)
首先,安装gconf-editor以获得gconftool-2命令 终端命令: gconftool-2 --set /apps/nautilus/desktop/computer_icon_visib ...
- hdu 5661 Claris and XOR
Claris and XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- c语言到汇编的学习
[内存结构] C程序通过编译-汇编-连接,最后到可执行文件.载入内存有这几个部分: text:正文段,存放的是可执行的机器码段 data:存放初始化之后的全局变量和静态变量 bbs:存放未初始化的静态 ...
- Restful.Data 开源持久层组件项目最新进展和使用说明
Restful.Data 经过 博客园 和 CSDN 的宣传,目前参与该项目的人数已达到 114 人(群号:338570336),虽大部分并不参与实际开发,但他们所提出的意见和建议以及在试用过程中发现 ...
- 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目
一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用 ...
- 作业二:在github上过程
注册Github
- 源代码版本管理与项目管理软件的认识与github的注册
源代码版本管理软件: 主要有:svn,cvs,hg,git,VSS 这些工具主要是一种记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.Perforce,StarTeam)- ...
- [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...
- CSS3 动画一瞥
伴随HTML5而来的CSS3让前端大湿们可以用简单的CSS样式即可写出动画效果来,而在这之前,一提到动画我们可能会想到JavaScript,Flash,Java插件等.如果是用JavaScript那倒 ...