CodeForces - 1037D Valid BFS?(BFS+思維)
阿新 • • 發佈:2018-12-03
題意
給你一棵樹,再給你一個序列。
問這個序列是不是BFS序。
思路來源
http://www.cnblogs.com/zxyqzy/p/9968156.html
題解
自己對bfs序總是想當然,以為滿足層序就是bfs...
但是不是,比如說1有兩棵子樹2和3,2有子樹4,3有子樹5
那麼若2在3前,4必在3後5前,才是bfs序,QAQ
對動態鄰接表內的點按訪問id排個序就好了。
這樣同一層的,就會優先滿足詢問序列的訪問順序,從而bfs。
程式碼
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <functional> const int INF=0x3f3f3f3f; const int maxn=2e5+10; const int mod=1e9+7; const int MOD=998244353; const double eps=1e-7; typedef long long ll; #define vi vector<int> #define si set<int> #define pii pair<int,int> #define pi acos(-1.0) #define pb push_back #define mp make_pair #define lowbit(x) (x&(-x)) #define sci(x) scanf("%d",&(x)) #define scll(x) scanf("%lld",&(x)) #define sclf(x) scanf("%lf",&(x)) #define pri(x) printf("%d",(x)) #define rep(i,j,k) for(int i=j;i<=k;++i) #define per(i,j,k) for(int i=j;i>=k;--i) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int n,id[maxn],a[maxn]; vector<int>G[maxn],ans; queue<int>q; bool vis[maxn]; void add(int x,int y) { G[x].push_back(y); } bool cmp(int x,int y) { return id[x]<id[y]; } void bfs(int s) { q.push(s); while(!q.empty()) { int tmp=q.front(),len=G[tmp].size(); q.pop(); if(vis[tmp])continue; vis[tmp]=1; ans.push_back(tmp); rep(i,0,len-1) if(!vis[G[tmp][i]]) q.push(G[tmp][i]); } } int main() { sci(n); rep(i,0,n-2) { int x,y; sci(x),sci(y); x--,y--; add(x,y); add(y,x); } rep(i,0,n-1) { int x; sci(a[i]); a[i]--; id[a[i]]=i; } rep(i,0,n-1)sort(G[i].begin(),G[i].end(),cmp); bfs(0); bool flag=1; rep(i,0,n-1) { if(ans[i]-a[i]) { flag=0; break; } } if(!flag)puts("No"); else puts("Yes"); return 0; }