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;
}
View Code

 

 

第二种做法我们给所有节点深度,把数组从头到尾扫一遍,每个节点把它的子孙节点的深度设为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;
}
View Code

 

posted @ 2018-09-03 08:39  LMissher  阅读(198)  评论(0)    收藏  举报