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;
}
浙公网安备 33010602011771号