版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}