[dfs+bfs]zoj 3811



 题意:

    在一个无向图中,能否按照一定的顺序访问图中的某些点,并且能访问的图中的所有的点

大致解法:

    先dfs一遍这个图是否强连通

    再用bfs判断这个图能否从标记的第1个点走到第k个点

    bfs的时候有一点要注意一下

    我一开始用的是普通的bfs,设一个值vvv,遇到一个标记点则vvv++,用这种办法bfs其实是错的,比如如下样例输出将是no

[dfs+bfs]zoj 3811

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int nMax = 100007;
const int mMax = 400008;
int n,m,nk,vis[nMax];
int smark[nMax],sum,marksort[nMax],vvv;
class edge{
public:
    int v,nex;
};edge e[mMax];
int k,head[nMax];
void addedge(int a,int b){
    e[k].v=b;
    e[k].nex=head[a];
    head[a]=k;k++;
}
void dfs(int loc){
    vis[loc]=1;
    sum++;
    for(int i=head[loc];i;i=e[i].nex){
        int v=e[i].v;
        if(!vis[v])dfs(v);
    }
}

bool bfs(){
    queue<int>que;
    int i,cv;
    memset(vis,0,sizeof(vis));
    vis[marksort[0]]=1;
    for(int is=0;is<nk;is++){
        if(vis[marksort[is]]==0)return 0;
        smark[marksort[is]]=0;
        que.push(marksort[is]);
        while(!que.empty()){
            int v=que.front();
            que.pop();
            for(i=head[v];i;i=e[i].nex){
                cv=e[i].v;
                if(!vis[cv]){
                    if(smark[cv]==0){
                        vis[cv]=1;
                        que.push(cv);
                    }else{
                        vis[cv]=1;
                    }
                }
            }
        }
    }
    return 1;
}
int main(){
    int casenum,i,ffa,ffb;
    cin>>casenum;
    while(casenum--){
        cin>>n>>m>>nk;
        memset(smark,0,sizeof(smark));
        for(i=0;i<nk;i++){
            cin>>ffa;
            smark[ffa]=1;
        }
        k=1;
        memset(head,0,sizeof(head));
        for(i=0;i<m;i++){
            cin>>ffa>>ffb;
            addedge(ffa,ffb);
            addedge(ffb,ffa);
        }
        cin>>ffa;
        for(i=0;i<ffa;i++){
            cin>>marksort[i];
        }
        if(ffa<nk){
            cout<<"No\n";
            continue;
        }
        sum=0;
        memset(vis,0,sizeof(vis));
        dfs(1);
        if(sum!=n){
            cout<<"No\n";
            continue;
        }
        if(bfs())cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

 

 

你可能感兴趣的:(DFS)