Codeforces | CF1037D 【Valid BFS?】

news/2024/7/7 20:39:48

题目大意:给定一个\(n(1\leq n\leq 2\cdot10^5)\)个节点的树的\(n-1\)条边和这棵树的一个\(BFS\)\(a_1,a_2,\dots,a_n\),判断这个\(BFS\)序是否是一个从节点\(1\)开始的合法\(BFS\)序,若合法则输出\(Yes\),否则输出\(No\)
题目核心问题是判断给出的\(BFS\)序的合法性,根据\(BFS\)的定义,每个节点的所有子节点在加入队列时应当是连续的,且同深度的节点的子节点入队顺序应该整体与父节点入队顺序相同,不妨把每个节点的所有子节点在给定的\(BFS\)序列中的顺序看做连续的区间.
考虑到\(BFS\)序列不合法的原因有以下可能:

  • \(a_1\neq 1\)
  • 存在\(i,j\)满足\(i<j\)\(dep[a_i]>dep[a_j]\)
  • 存在\(i,j\)满足\(i\neq j\)\(a_i=a_j\)
  • 存在\(i,j\)满足\(i<j\)\(a_i\)的某个子节点\(u\)\(a_j\)的某个子节点\(v\)满足在\(BFS\)序中\(u\)\(v\)之后

处理思路:对于给出的树先跑一边\(BFS\)求每个点的\(dep\)和其子节点在\(a\)序列中的位置区间,按照上述四种情况进行判断.

下面放\(AC\)代码\(\downarrow\downarrow\downarrow\)

#include<cstdio>//CF1037D
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<queue>

using namespace std;

const int N=200010,NN=400020;

struct interval{
    int l,r;
};

int fr[N],edge[NN],nxt[NN],n,dep[N],vis[N],app[N],a[N],fa[N],dy[N];

interval il[N];

queue<int>q;

void bfs(){
    q.push(1);
    dep[1]=1;
    int u;
    while(!q.empty()){
        u=q.front();
        vis[u]=1;
        q.pop();
        int now=fr[u],v;
        while(now){
            v=edge[now];
            if(!vis[v]){
                dep[v]=dep[u]+1;
                fa[v]=u;
                q.push(v);
                il[u].l=min(il[u].l,dy[v]);
                il[u].r=max(il[u].r,dy[v]);
            }
            now=nxt[now];
        }
    }
}

bool check(){
    if(a[1]!=1){
        return false;
    }
    int nowdep;
    for(int i=1;i<=n;i++){
        if(dep[a[i]]<nowdep||app[a[i]]){
            return false;
        }
        else{
            app[a[i]]=1;
            nowdep=dep[a[i]];
        }
    }
    int tr=1;
    for(int i=1;i<=n;i++){
        if(il[a[i]].l==200010){
            continue;
        }
        if(il[a[i]].l>tr){
            tr=il[a[i]].r;
        }
        else{
            return false;
        }
    }
    return true;
}

int main(){
    scanf("%d",&n);
    int u,v;
    for(int i=1;i<=n;i++){
        il[i].l=200010;
        il[i].r=0;
    }
    for(int i=1;i<n;i++){
        int j=i+n;
        scanf("%d%d",&u,&v);
        edge[i]=v;
        nxt[i]=fr[u];
        fr[u]=i;
        edge[j]=u;
        nxt[j]=fr[v];
        fr[v]=j;
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        dy[a[i]]=i;
    }
    bfs();
    if(check()){
        printf("Yes\n");
        return 0;
    }
    else{
        printf("No\n");
        return 0;
    }
    return 0;
} 

转载于:https://www.cnblogs.com/--BLUESKY007/p/9580486.html


http://www.niftyadmin.cn/n/2257136.html

相关文章

Linux hostname主机名的配置文件/etc/hosts详细介绍

2019独角兽企业重金招聘Python工程师标准>>> 1、 什么是Linux主机名 无论在局域网还是INTERNET上&#xff0c;每台主机都有一个IP地址&#xff0c;是为了区分此台主机和彼台主机&#xff0c;也就是说IP地址就是主机的门牌号。但IP地址不 方便记忆&#xff0c;所以又…

下载多张图片并压缩成压缩包

工具类 package com.manage.util;import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.i…

sklearn的train_test_split

train_test_split函数用于将矩阵随机划分为训练子集和测试子集&#xff0c;并返回划分好的训练集测试集样本和训练集测试集标签。 格式&#xff1a; X_train,X_test, y_train, y_test cross_validation.train_test_split(train_data,train_target,test_size0.3, random_state0)…

Spring Cloud Gateway过滤器工厂GatewayFilterFactory初探

1. 概述 在【spring cloud gateway】的官方文档中&#xff0c;是这样说明GatewayFilterFactory的&#xff1a; Route filters allow the modification of the incoming HTTP request or outgoing HTTP response in some manner. Route filters are scoped to a particular rout…

计算机系统管理内存的大小是由什么决定的,请问行家,电脑的虚拟内存是什么,它的大小由什么决定 爱问知识人...

虚拟内存用硬盘空间做内存来弥补计算机RAM空间的缺乏。当实际RAM满时(实际上&#xff0c;在RAM满之前)&#xff0c;虚拟内存就在硬盘上创建了。当物理内存用完后&#xff0c;虚拟内存管理器选择最近没有用过的&#xff0c;低优先级的内存部分写到交换文件上。这个过程对应用是隐…

Netflix开发者大赛,云计算1.0,还是2.0?

Joe Emison是BuildFax公司的CTO和创始人&#xff0c;该公司为企业提供地产方面的数据&#xff0c;在技术架构上以云计算为基础。最近&#xff0c;Joe Emsion在信息周刊上发表文章《Netflix如何毁掉云计算》&#xff0c;指责Netflix最近举办的云计算开发者大赛抱有“以AWS为中心…

XXL-JOB框架

目录【简介】【入门篇】【使用篇】【总结】【简介】 轻量级分布式任务调度平台: 官网&#xff1a; http://www.xuxueli.com/xxl-job/#/ 【入门篇】 官网的文档写的非常详细&#xff0c;可以参考官方文档的步骤进行部署。这里大概的记录下大概的步骤 1、下载源码 2、解压并…

内容页fragment注意事项

###类似新闻内容页,viewpager加载多个fragment并且经常切换的需求,这种情况下的内存需要特别注意&#xff0c;一不小心处理不当很容易出现内存暴涨&#xff0c;频繁触发gc页面卡顿&#xff0c;甚至oom的情况&#xff0c;针对这种需求总结下面几点注意事项 ###注意事项 1.采用Fr…