codeforces 1037D. Valid BFS?

题目链接https://codeforces.com/problemset/problem/1037/D

这道题目我几乎是一个测试点一个测试点过的,64个测试点,一把心酸泪

题目中的BFS要求以随机的顺序遍历一个节点邻接点。这个条件是关键。因为当前的节点顺序会影响下一层邻接点的顺序。

我的思路就是从队列中弹出节点时,先获取这个节点的全部邻接点,装入set中。然后读取输入的节点,如果set包含读入的节点,就把这个节点

从set删去,同时把这个节点入队。如果不包含,说明这个序列不是BFS。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<unordered_map>
#include<set>
#include<queue>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
using namespace std;
///不要忘记加10
const int MAXN=2e5+10;
int N;
vector<int> G[MAXN];
queue<int>q;
set<int>visited;
int vis[MAXN];
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&N);
    for(int i=1;i<N;i++){
        int s,e;
        scanf("%d%d",&s,&e);
        G[s].push_back(e);
        G[e].push_back(s);
    }
    bool f=true;
    int t;
    scanf("%d",&t);
    q.push(t);
    vis[t]=true;
    if(t!=1)f=false;
    else
    while(!q.empty()){
        t=q.front();
        q.pop();
        for(int i=0;i<G[t].size();i++){
            if(!vis[G[t][i]])visited.insert(G[t][i]);
        }
        while(!visited.empty()){
            int k;
            scanf("%d",&k);
            if(visited.count(k)){
                visited.erase(k);
            }
            else {
                f=false;break;
            }
            if(!vis[k])
            {
                q.push(k);
                vis[k]=true;
            }
        }
        if(!f)break;
    }
    string ans=f?"Yes":"No";
    printf("%s",ans.c_str());
}

猜你喜欢

转载自www.cnblogs.com/MalcolmMeng/p/9657228.html