将每层节点存到set里在用另一个set题目给的序列,比较一下就可以了。
#include<iostream>
#include <cstring>
#include<bits/stdc++.h>
using namespace std;
#define LL long long
vector<int>g[511111];
int a[511111];
#define INF 0x3f3f3f
int vis[5111111];
int dis[5111111];
int pre[5111111];
set<int>se;
set<int>ans;
int flag=1;
void bfs(int x)
{
queue<int>q;
q.push(1);
int j=1;
vis[1]=1;
while(!q.empty())
{
int f=q.front();
q.pop();
for(int i=0; i<g[f].size(); i++)
{
int v=g[f][i];
if(!vis[v])
{ //printf("%d...\n",v);
se.insert(v);
vis[v]=1;
// q.push(v);
}
}
int k=se.size();
for(int i=0;i<k;i++,j++)
{
ans.insert(a[j]);
q.push(a[j]);
}
/* printf("\n--------------\n");
for(auto i:ans)
{
printf("%d ",i);
}
printf("\n......\n");
for(auto i:se)
{
printf("%d ",i);
}*/
if(ans!=se)
{
flag=0;
break;
}
se.clear();
ans.clear();
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n-1; i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
bfs(1);
if(flag)
{
printf("Yes\n");
}
else printf("No\n");
}