cf 1037D Valid BFS?
给一个树上的BFS序列问是否合法,BFS都以1为根节点。
第一种做法比较容易想到,每遇到一个节点查找它后面的size节点是否在子树里在就推入队列,有不在的就不合法。
#include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) using namespace std; typedef long long ll; typedef double db; const int M = 2e5+7; const double pi = acos(-1); const int inf = 2147483647; const int mod = 1e9+7; int n,a[M],tmp; vector<int> vec[M],g[M]; queue<int> q; void dfs(int u,int fa){ for(int i=0;i<vec[u].size();i++){ int v=vec[u][i]; if(v==fa) continue; g[u].push_back(v); dfs(v,u); } } bool bfs(int s){ q.push(s); while(!q.empty()){ int u=q.front();q.pop(); for(int i=tmp;i<tmp+g[u].size();i++){ if(a[i]<*g[u].begin()||a[i]>*(g[u].end()-1)) return false; int fi=lower_bound(g[u].begin(),g[u].end(),a[i])-g[u].begin(); if(g[u][fi]!=a[i]){ return false; } q.push(a[i]); } tmp+=g[u].size(); } return true; } int main(){ //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); scanf("%d",&n); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } for(int i=1;i<=n;i++) scanf("%d",&a[i]); if(a[1]!=1){ printf("No\n"); return 0; } dfs(a[1],-1); for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end()); tmp=2; if(bfs(a[1])) printf("Yes\n"); else printf("No\n"); return 0; }
第二种做法我们给所有节点深度,把数组从头到尾扫一遍,每个节点把它的子孙节点的深度设为i+1,那么如果最后的数组是补升序的那就不合法。
扫一遍得时候得特判一下如果这个节点不应该现在出现,出现了则不合法。
#include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) using namespace std; typedef long long ll; typedef double db; const int M = 2e5+7; const double pi = acos(-1); const int inf = 2147483647; const int mod = 1e9+7; int n,a[M],tmp,ans[M]; vector<int> vec[M],g[M]; queue<int> q; void dfs(int u,int fa){ for(int i=0;i<vec[u].size();i++){ int v=vec[u][i]; if(v==fa) continue; g[u].push_back(v); dfs(v,u); } } bool bfs(int s){ ans[s]=1; for(int i=1;i<=n;i++){ if(ans[a[i]]==-1) return false; for(int j=0;j<g[a[i]].size();j++){ ans[g[a[i]][j]]=i+1; } } for(int i=2;i<=n;i++){ if(ans[a[i]]<ans[a[i-1]]) return false; } return true; } int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d",&n); mem1(ans); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } for(int i=1;i<=n;i++) scanf("%d",&a[i]); if(a[1]!=1){ printf("No\n"); return 0; } dfs(a[1],-1); if(bfs(a[1])) printf("Yes\n"); else printf("No\n"); return 0; }

浙公网安备 33010602011771号