题意:
给出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;
}