题目:Valid BFS?
题意:给出一棵树和一个序列,问这个序列能否是这棵数的一种bfs遍历方式。
思路:
把存图的顺序按照数在序列中出现的顺序排列,再bfs求解。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 200000
int n;
int a[maxn+5],b[maxn+5];
vector<int> g[maxn+5];
void readin() {
scanf("%d",&n);
for(int i=1;i<n;i++) {
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
}
bool cmp(const int& x,const int& y) {
return b[x]<b[y];
}
void init() {
for(int i=1;i<=n;i++) {
b[a[i]]=i;
}
for(int i=1;i<=n;i++) {
sort(g[i].begin(),g[i].end(),cmp);
for(int j=0;j<g[i].size();j++) {
int y=g[i][j];
}
}
}
vector<int> ans;
queue<int> que;
bool vis[maxn+5];
void bfs() {
que.push(1);
vis[1]=true;
while(!que.empty()) {
int h=que.front();
que.pop();
ans.push_back(h);
for(int i=0;i<g[h].size();i++) {
int y=g[h][i];
if(vis[y]) continue;
vis[y]=true;
que.push(y);
}
}
}
bool judge() {
for(int i=0;i<ans.size();i++) {
if(a[i+1]!=ans[i]) return false;
}
return true;
}
int main() {
readin();
if(a[1]!=1) {
printf("No");
return 0;
}
init();
bfs();
if(judge()) printf("Yes");
else printf("No");
return 0;
}