把每个节点附加一个权值,表示节点在输出序列的位置,每一维vec都按照这个权值来排序,或者用优先队列,map,都可以
#include<bits/stdc++.h> using namespace std; struct node{ int num; int index; }no[200010]; int x[200010],y[200010]; vector<node> vec[200010]; vector<int> ans; vector<int> in; queue<node> que; bool vis[200010]; bool cmp(node A,node B) { return A.index<B.index; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) no[i].num=i; for(int i=1;i<=n-1;i++) { scanf("%d%d",&x[i],&y[i]); } for(int i=1;i<=n;i++) { int tmp; scanf("%d",&tmp); in.push_back(tmp); no[tmp].index=i; } for(int i=1;i<=n-1;i++) { int xx=x[i],yy=y[i]; vec[xx].push_back(no[yy]); vec[yy].push_back(no[xx]); } for(int i=1;i<=n;i++)//对邻接表的每一维排序,或者用优先队列也可以 { sort(vec[i].begin(),vec[i].end(),cmp); } /*for(int i=1;i<=n;i++) { for(int j=0;j<vec[i].size();j++) { printf("%d ",vec[i][j].num); } printf(" "); }*/ que.push(no[1]); ans.push_back(1); vis[1]=true; while(!que.empty()) { node now=que.front(); que.pop(); int x=now.num; for(int i=0;i<vec[x].size();i++) { node to=vec[x][i]; int y=to.num; if(vis[y]) continue; vis[y]=true; ans.push_back(y); que.push(to); } } for(int i=0;i<ans.size();i++) { if(ans[i]!=in[i]) { printf("No "); return 0; } } printf("Yes "); }