• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yongchaoD

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

CodeForces1037 D. Valid BFS? (判断是否是bfs搜索路径)

题意:
建好图,给你路径,判断该路径是否是bfs的搜索路径。

题意:由于bfs的路径并不是唯一的,走的bfs路径可能并不会是数据的bfs路径,但其实也是正确的bfs,但是走一个判断一个路径,然后输出,是会WA的。
那就强制改变下bfs搜索的优先路径,数据给的路径只是bfs的其中一条路径。那每次搜索temp节点的子节点,判断该路径中是否被包含于temop的子节点。是说明,目前是正确的bfs路径,然后强制走该路径,如果不是,则不是正确的bfs路径。
问题来了,如何来维护temp的子节点呢?用于查询是否有path节点,那就是set容器的count查询

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+9;
vector<int>G[N];
vector<int>vis(N,0);
queue<int>path;
set<int>se;


bool bfs(){
    queue<int>q;
    q.push(1);

    while(!q.empty()){
        int temp=q.front();
        q.pop();
        if(vis[temp]) continue;
        vis[temp]=1;

        for(auto t:G[temp]){
            if(!vis[t]) se.insert(t);//temp节点的子节点按编号排个序
        }

        while(!se.empty()){//检查路径是否都是优先temp的子节点,不是,那就不是bfs的搜索
            if(se.count(path.front())){
                q.push(path.front());
                se.erase(path.front());
                path.pop();
            }
            else{
                printf("No\n");
                return false;
            }
        }
    }
    return true;
}

int main()
{
    int n,u,v;
    cin>>n;
    for(int i=1;i<n;i++){
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }

    for(int i=1;i<=n;i++){
        scanf("%d",&u);
        path.push(u);
    }
    if(path.front()!=1){
        printf("No\n");
        return 0;
    }
    else{
        path.pop();
        if(bfs()) printf("Yes\n");
    }

    return 0;
}

posted on 2024-07-06 17:04  yongchaoD  阅读(16)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3