不管怎么说,这都不是道紫题吧。。。
这里采用的思想有点类似轻重链剖分。
我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序。
这样(如果序列没错)肯定会按照序列的方式遍历完全图。
所以我们就按照这个图跑一遍BFS。
一边BFS一边查看是否符合。
程序的速度不算特别快,最优解rank11。(写丑了)
AC代码如下:
1925ms 9776kb
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 namespace StandardIO{ 6 7 template<typename T>inline void read(T &x){ 8 x=0;T f=1;char c=getchar(); 9 for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1; 10 for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0'; 11 x*=f; 12 } 13 14 template<typename T>inline void write(T x){ 15 if(x<0)putchar('-'),x*=-1; 16 if(x>=10)write(x/10); 17 putchar(x%10+'0'); 18 } 19 20 } 21 22 using namespace StandardIO; 23 24 namespace Solve{ 25 26 const int N=200200; 27 int n,cnt; 28 int a[N],b[N],vis[N]; 29 vector<int>G[N]; 30 31 inline bool cmp(int x,int y){ 32 return a[x]<a[y]; 33 } 34 35 inline void solve(){ 36 read(n); 37 for(register int i=1;i<=n-1;++i){ 38 int u,v; 39 read(u),read(v); 40 G[u].push_back(v),G[v].push_back(u); 41 } 42 for(register int i=1;i<=n;++i){ 43 read(b[i]),a[b[i]]=i; 44 } 45 for(register int i=1;i<=n;++i){ 46 sort(G[i].begin(),G[i].end(),cmp); 47 } 48 queue<int>q; 49 q.push(1); 50 while(!q.empty()){ 51 int now=q.front();q.pop(); 52 if(vis[now])continue; 53 vis[now]=1; 54 if(b[++cnt]!=now){ 55 puts("No"); 56 return; 57 } 58 for(register int i=0;i<G[now].size();++i){ 59 // cout<<G[now][i]<<endl; 60 q.push(G[now][i]); 61 } 62 } 63 puts("Yes"); 64 } 65 } 66 67 using namespace Solve; 68 69 int main(){ 70 // freopen(".in","r",stdin); 71 // freopen(".out","w",stdout); 72 solve(); 73 }