2014牡丹江网络zoj3816Generalized Palindromic Number(dfs或者bfs)

简介:
复制代码
  1 #include <iostream>     
  2 #include <stdio.h>     
  3 #include <cmath>     
  4 #include <algorithm>     
  5 #include <iomanip>     
  6 #include <cstdlib>     
  7 #include <string>     
  8 #include <memory.h>     
  9 #include <vector>     
 10 #include <queue>     
 11 #include <stack>     
 12 #include <map>   
 13 #include <set>   
 14 #include <ctype.h>     
 15 #include <sstream> 
 16 #define INF 1000000000 
 17 #define ll long long 
 18 #define min3(a,b,c) min(a,min(b,c)) 
 19 #define max3(a,b,c) max(a,max(b,c)) 
 20 #define MAXN 100010 
 21    
 22 using namespace std;   
 23 
 24 bool mk[100010];
 25 bool vis[100010];
 26 bool open[100010];
 27 
 28 vector<int> E[100010];
 29 queue<int> K;
 30 
 31 int main(){
 32     int t;
 33     cin>>t;
 34     while(t--){
 35         memset(mk,0,sizeof(mk));
 36         memset(E,0,sizeof(E));
 37         memset(vis,0,sizeof(vis));
 38         memset(open,0,sizeof(open));
 39         while(!K.empty()) K.pop();
 40         
 41         int n,m,k;
 42         cin>>n>>m>>k;
 43         
 44         for(int i=1;i<=k;i++){
 45             int tmp;
 46             cin>>tmp;
 47         }
 48         
 49         for(int i=1;i<=m;i++){
 50             int u,v;
 51             scanf("%d%d",&u,&v);
 52             E[u].push_back(v);
 53             E[v].push_back(u);
 54         }
 55         
 56         
 57         int L;
 58         cin>>L;
 59         
 60         for(int i=1;i<=L;i++){
 61             int tmp;
 62             cin>>tmp;
 63             mk[tmp]=1;
 64             K.push(tmp);
 65         }
 66         if(L<k){
 67             cout<<"No"<<endl;
 68             continue;
 69         }
 70          
 71         bool ok=0;
 72         
 73          int nt;
 74         int start=K.front(); K.pop(); mk[start]=0; vis[start]=1;
 75         queue<int> que;
 76         que.push(start);
 77         if(!K.empty())  nt=K.front();
 78         while(!que.empty()){
 79             int cur=que.front(); que.pop();
 80             int siz=E[cur].size();
 81             for(int i=0;i<siz;i++){
 82                 int v=E[cur][i];
 83                 if(!vis[v]&&!mk[v]){
 84                     vis[v]=1;
 85                     que.push(v);
 86                 }
 87                 
 88                 if(v==nt&&!vis[v]){
 89                     vis[v]=1;
 90                     que.push(v);
 91                     mk[v]=0;
 92                     K.pop();
 93                     if(!K.empty()) nt=K.front();
 94                 }
 95                 else if(!vis[v]&&mk[v])
 96                     open[v]=1;
 97             }
 98 
 99             if(que.empty()){
100                 if(open[nt]==1&&!vis[nt]){
101                     K.pop();
102                     que.push(nt);
103                     mk[nt]=0;
104                     vis[nt]=1;
105                     if(!K.empty())
106                         nt=K.front();
107                 }
108             }
109         }
110             
111         bool flag=true;
112         for(int i=1; i<=n; ++i)
113            if(!vis[i]){
114                    flag=false;
115                    break;
116            }
117         if(K.empty() && flag) ok=1;
118         if(ok){
119             cout<<"Yes"<<endl;
120         }else{
121             cout<<"No"<<endl;
122         }
123         
124     }
125     return 0;
126     
127 }
复制代码
复制代码
  1 /*
  2     题意: 给定一个n个节点m条边的无向图,接着又给出一个序列(由图中的一些节点所组成) 
  3     问能否按照给定序列的顺序来访问图,并且保证图可以访问完毕!
  4     
  5     思路:是可以走回头路的搜索!那么我们就按照给定的序列进行搜索,如果当前的节点在给定序列中
  6     出现过,但是访问的顺序和给定序列的顺序不一样,那么就将该节点标记一下open[];
  7     第一次搜索完毕之后,接着从open[]标记的节点(并且该节点符合给定序列的顺序)开始搜索! 
  8     最后不要忘记检查图的连通性.... 
  9     如果不清楚,还是看代码吧.... 
 10 */
 11 #include<iostream>
 12 #include<cstring>
 13 #include<cstdio>
 14 #include<algorithm>
 15 #include<vector>
 16 #define N 100005
 17 using namespace std;
 18 
 19 vector<int>g[N];
 20 int vis[N], open[N];
 21 int mk[N], que[N];
 22 int n, m, k, l, cnt;
 23 bool flag;
 24 
 25 void init(){
 26     memset(vis, 0, sizeof(vis));
 27     memset(open, 0, sizeof(open));
 28     memset(mk, 0, sizeof(mk));
 29     memset(g, 0, sizeof(g));
 30 }
 31 
 32 void dfs(int u){
 33     vis[u]=1;
 34     open[u]=0;
 35     if(u==que[cnt]){
 36         ++cnt;
 37         if(cnt>k) flag=true;
 38     }
 39     else if(mk[u])
 40        vis[u]=0;
 41     int len=g[u].size();
 42     for(int i=0; i<len; ++i){
 43         int v=g[u][i];
 44         if(!vis[v]){
 45             if(mk[v] && v!=que[cnt]){
 46                 open[v]=1;
 47                 continue;
 48             }
 49             if(open[v] && v!=que[cnt])
 50                 continue;
 51             dfs(v);
 52         }
 53     }
 54 }
 55 
 56 int main(){
 57     int t;
 58     scanf("%d", &t);
 59     while(t--){
 60         init();
 61         scanf("%d%d%d", &n, &m, &k);
 62         for(int i=1; i<=k; ++i){
 63             int x;
 64             scanf("%d", &x);
 65             mk[x]=1;
 66         }
 67         
 68         while(m--){
 69             int u, v;
 70             scanf("%d%d", &u, &v);
 71             g[u].push_back(v);
 72             g[v].push_back(u);
 73         }
 74         scanf("%d", &l);
 75         for(int i=1; i<=l; ++i)
 76             scanf("%d", &que[i]);
 77         if(l<k){
 78             printf("No\n");
 79             continue;
 80         }
 81         cnt=1;
 82         flag=false;
 83         open[que[cnt]]=1;
 84         while(cnt<=k){//就是从给定序列节点开始并且open标记开始搜索 
 85                 if(!open[que[cnt]]) break;//如果访问到给定序列的当前节点没有被open标记,说明 
 86                 dfs(que[cnt]);            //不能按照给定的序列的顺序访问图中的节点 
 87         }
 88         if(flag){
 89                int i;
 90                for(i=1; i<=n; ++i)
 91                   if(!vis[i])  break;
 92                if(i>n)
 93                   printf("Yes\n");
 94                   else printf("No\n");
 95         }
 96         else
 97                   printf("No\n");
 98     }
 99     return 0;
100 }









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3961406.html,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
存储 算法 Python
Python图论实战:从零基础到精通DFS与BFS遍历,轻松玩转复杂网络结构
【7月更文挑战第11天】图论在数据科学中扮演关键角色,用于解决复杂网络问题。Python因其易用性和库支持成为实现图算法的首选。本文通过问答形式介绍DFS和BFS,图是节点和边的数据结构,遍历用于搜索和分析。Python中图可表示为邻接表,DFS用递归遍历,BFS借助队列。DFS适用于深度探索,BFS则用于最短路径。提供的代码示例帮助理解如何在Python中应用这两种遍历算法。开始探索图论,解锁更多技术可能!
134 6
|
6月前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
146 9
|
算法
[leetcode] 2039. 网络空闲的时刻 | BFS
题意: 给定一张n个点不含重边的无向图,点的编号从0开始到n-1,两点之间如果有连边,可以认为耗时为1秒 1->n-1的点都需要向0号点发送消息(从第0秒开始) 在0号收到消息之后,会回复消息; 从第一秒开始,如果1->n-1号服务器经过patiennce[]时间都还没有收到回复的消息,那么就会重新发送请求的消息 问最早的网络中没有消息传输的时间是什么时候
95 0
[leetcode] 2039. 网络空闲的时刻 | BFS
|
机器学习/深度学习
2039. 网络空闲的时刻 : 简单「建图 + BFS」运用题
2039. 网络空闲的时刻 : 简单「建图 + BFS」运用题
LeetCode 2039. 网络空闲的时刻(BFS)
LeetCode 2039. 网络空闲的时刻(BFS)
163 0
LeetCode 2039. 网络空闲的时刻(BFS)
2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
/*   将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std...
675 0
|
6天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第40天】在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术以及安全意识等方面的知识,帮助读者更好地了解网络安全的重要性,并提供一些实用的技巧和建议,以保护个人和组织的信息安全。
29 6

热门文章

最新文章

下一篇
无影云桌面