题目:Valid BFS?
题意:给出一棵树和一个序列,问这个序列能否是这棵数的一种bfs遍历方式。
思路:
把存图的顺序按照数在序列中出现的顺序排列,再bfs求解。
代码:
#include<bits/stdc++.h>
using namespace std;#define maxn 200000int 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;
}