题解 CF1037D 【Valid BFS?】

不管怎么说,这都不是道紫题吧。。。


 

这里采用的思想有点类似轻重链剖分。

我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序。

这样(如果序列没错)肯定会按照序列的方式遍历完全图。

所以我们就按照这个图跑一遍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 }

 

转载于:https://www.cnblogs.com/ilverene/p/9846277.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值