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()); }