Manthan, Codefest 18 (rated, Div. 1 + Div. 2) D. Valid BFS?(BFS)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37360631/article/details/82388153

题意:
给出n-1对相连点的编号,分析广搜能否产生给定的序列。
分析:
先把每个点相连的点按照给定的顺序排序,然后广搜一下,看能否按照指定的顺序放进队列。

#include<bits/stdc++.h>
#define maxn 300010
using namespace std;
int n;
bool flag;
int a[maxn];
vector<int> e[maxn];
int vis[maxn],id[maxn];
bool cmp(int a,int b){
    if(id[a]<id[b]) return 1;
    return 0;
}

int main(){
        std::ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<n;i++){
            int a,b;
            cin>>a>>b;
            e[a].push_back(b);
            e[b].push_back(a);
        }


        for(int i=1;i<=n;i++){
            cin>>a[i];
            id[a[i]]=i;
        }

        for(int i=1;i<=n;i++)
            sort(e[a[i]].begin(),e[a[i]].end(),cmp);
        queue<int> q;
        q.push(1);
        vis[1]=1;
        int cur=1;
        flag=false;
        while(!q.empty()){
            int nq=q.front();
            q.pop();
            if(a[cur]!=nq){
                flag=true;
                break;
            }
            //这里每次写都错,从0开始
            for(int i=0;i<e[nq].size();i++){
                if(!vis[e[nq][i]]){
                    q.push(e[nq][i]);
                    vis[e[nq][i]]=1;
                }
            }
            cur++;
        }
        if(flag) cout<<"No"<<endl;
        else cout<<"Yes"<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/82388153
今日推荐