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[100010];
bool vis[100010];
bool open[100010];

vector<int> E[100010];
queue<int> K;

int main(){
    int t;
    cin>>t;
    while(t--){
        memset(mk,0,sizeof(mk));
        memset(E,0,sizeof(E));
        memset(vis,0,sizeof(vis));
        memset(open,0,sizeof(open));
        while(!K.empty()) K.pop();
        
        int n,m,k;
        cin>>n>>m>>k;
        
        for(int i=1;i<=k;i++){
            int tmp;
            cin>>tmp;
        }
        
        for(int i=1;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=1;i<=L;i++){
            int tmp;
            cin>>tmp;
            mk[tmp]=1;
            K.push(tmp);
        }
        if(L<k){
            cout<<"No"<<endl;
            continue;
        }
         
        bool ok=0;
        
         int nt;
        int start=K.front(); K.pop(); mk[start]=0; vis[start]=1;
        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=0;i<siz;i++){
                int v=E[cur][i];
                if(!vis[v]&&!mk[v]){
                    vis[v]=1;
                    que.push(v);
                }
                
                if(v==nt&&!vis[v]){
                    vis[v]=1;
                    que.push(v);
                    mk[v]=0;
                    K.pop();
                    if(!K.empty()) nt=K.front();
                }
                else if(!vis[v]&&mk[v])
                    open[v]=1;
            }

            if(que.empty()){
                if(open[nt]==1&&!vis[nt]){
                    K.pop();
                    que.push(nt);
                    mk[nt]=0;
                    vis[nt]=1;
                    if(!K.empty())
                        nt=K.front();
                }
            }
        }
            
        bool flag=true;
        for(int i=1; i<=n; ++i)
           if(!vis[i]){
                   flag=false;
                   break;
           }
        if(K.empty() && flag) ok=1;
        if(ok){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
        
    }
    return 0;
    
}


/*
    题意: 给定一个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, 0, sizeof(vis));
    memset(open, 0, sizeof(open));
    memset(mk, 0, sizeof(mk));
    memset(g, 0, sizeof(g));
}

void dfs(int u){
    vis[u]=1;
    open[u]=0;
    if(u==que[cnt]){
        ++cnt;
        if(cnt>k) flag=true;
    }
    else if(mk[u])
       vis[u]=0;
    int len=g[u].size();
    for(int i=0; i<len; ++i){
        int v=g[u][i];
        if(!vis[v]){
            if(mk[v] && v!=que[cnt]){
                open[v]=1;
                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=1; i<=k; ++i){
            int x;
            scanf("%d", &x);
            mk[x]=1;
        }
        
        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=1; i<=l; ++i)
            scanf("%d", &que[i]);
        if(l<k){
            printf("No\n");
            continue;
        }
        cnt=1;
        flag=false;
        open[que[cnt]]=1;
        while(cnt<=k){//就是从给定序列节点开始并且open标记开始搜索 
                if(!open[que[cnt]]) break;//如果访问到给定序列的当前节点没有被open标记,说明 
                dfs(que[cnt]);            //不能按照给定的序列的顺序访问图中的节点 
        }
        if(flag){
               int i;
               for(i=1; i<=n; ++i)
                  if(!vis[i])  break;
               if(i>n)
                  printf("Yes\n");
                  else printf("No\n");
        }
        else
                  printf("No\n");
    }
    return 0;
}

目录
相关文章
|
1月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
48 1
|
1月前
|
算法 数据中心
数据结构之数据中心网络路由(BFS)
本文介绍了数据中心网络路由中使用广度优先搜索(BFS)算法的重要性及其应用。随着数据中心从集中式大型机系统发展到分布式架构,高效的数据路由成为确保低延迟、高吞吐量和网络可靠性的关键。BFS通过系统地探索网络层次,从源节点开始向外遍历,确保发现最短路径,特别适合于数据中心网络环境。文中还提供了BFS算法的具体实现代码,展示了如何在数据中心网络中应用该算法来查找节点间的最短路径,并讨论了BFS的优缺点。
45 0
数据结构之数据中心网络路由(BFS)
|
1月前
|
存储 算法 UED
数据结构之网络流量路径分析(BFS)
网络流量路径分析利用BFS算法在网络图中寻找从源节点到目标节点的最短路径,帮助识别网络瓶颈、优化数据流,提升网络性能。本示例通过构建一个无向图,展示了如何使用BFS算法进行路径分析,找到从节点0到节点5的有效路径,验证了算法的实用性和有效性。
52 0
|
算法
[leetcode] 2039. 网络空闲的时刻 | BFS
题意: 给定一张n个点不含重边的无向图,点的编号从0开始到n-1,两点之间如果有连边,可以认为耗时为1秒 1->n-1的点都需要向0号点发送消息(从第0秒开始) 在0号收到消息之后,会回复消息; 从第一秒开始,如果1->n-1号服务器经过patiennce[]时间都还没有收到回复的消息,那么就会重新发送请求的消息 问最早的网络中没有消息传输的时间是什么时候
103 0
[leetcode] 2039. 网络空闲的时刻 | BFS
|
机器学习/深度学习
2039. 网络空闲的时刻 : 简单「建图 + BFS」运用题
2039. 网络空闲的时刻 : 简单「建图 + BFS」运用题
LeetCode 2039. 网络空闲的时刻(BFS)
LeetCode 2039. 网络空闲的时刻(BFS)
168 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...
679 0
|
14天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
55 17

热门文章

最新文章