zoukankan      html  css  js  c++  java
  • [CF1037D] Valid BFS?

    问题描述

    The BFS algorithm is defined as follows.

    1. Consider an undirected graph with vertices numbered from 11 to n. Initialize q as a new queue containing only vertex 11, mark the vertex 11 as used.
    2. Extract a vertex v from the head of the queue q.
    3. Print the index of vertex v.
    4. Iterate in arbitrary order through all such vertices u that u is a neighbor of v and is not marked yet as used. Mark the vertex u as used and insert it into the tail of the queue q.
    5. If the queue is not empty, continue from step 2.
    6. Otherwise finish.

    Since the order of choosing neighbors of each vertex can vary, it turns out that there may be multiple sequences which BFS can print.

    In this problem you need to check whether a given sequence corresponds to some valid BFS traversal of the given tree starting from vertex 11. The tree is an undirected graph, such that there is exactly one simple path between any two vertices.

    输入格式

    The first line contains a single integer n (1≤n≤2⋅105) which denotes the number of nodes in the tree.

    The following n−1n−1 lines describe the edges of the tree. Each of them contains two integers x and y(1≤x,y≤n) — the endpoints of the corresponding edge of the tree. It is guaranteed that the given graph is a tree.

    The last line contains n distinct integers a1,a2,…,an (1≤ai≤n) — the sequence to check.

    输出格式

    Print "Yes" (quotes for clarity) if the sequence corresponds to some valid BFS traversal of the given tree and "No" (quotes for clarity) otherwise.

    You can print each letter in any case (upper or lower).

    样例输入输出

    样例输入1

    4
    1 2
    1 3
    2 4
    1 2 3 4

    样例输出1

    Yes

    样例输入2

    4
    1 2
    1 3
    2 4
    1 2 4 3

    样例输出2

    No

    提示

    Both sample tests have the same tree in them.

    In this tree, there are two valid BFS orderings:

    • 1,2,3,4
    • 1,3,2,4

    The ordering 1,2,4,3doesn't correspond to any valid BFS order.

    题目大意

    给你一棵树以及一个序列,判断该序列是否为这棵树的一个合法BFS序。

    解析

    BFS序的特征是会先列举出同一层的所有点,同时下一层的子结点要按照上一层的顺序列出。利用这个性质就可以接着道题了。记录每个点的儿子个数son[i],一个点的同一层的子节点必然在连续一段,长度为son[i]。每检查完一段就跳到当前父节点的下一个节点。

    代码

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #define N 200002
    using namespace std;
    int head[N],ver[N*2],nxt[N*2],l;
    int n,i,j,k,son[N],fa[N],a[N];
    int read()
    {
    	char c=getchar();
    	int w=0;
    	while(c<'0'||c>'9') c=getchar();
    	while(c<='9'&&c>='0'){
    		w=w*10+c-'0';
    		c=getchar();
    	}
    	return w;
    }
    void insert(int x,int y)
    {
    	l++;
    	ver[l]=y;
    	nxt[l]=head[x];
    	head[x]=l;
    }
    void dfs(int x,int pre)
    {
    	fa[x]=pre;
    	for(int i=head[x];i;i=nxt[i]){
    		int y=ver[i];
    		if(y!=pre){
    			son[x]++;
    			dfs(y,x);
    		}
    	}
    }
    int main()
    {
    	n=read();
    	for(i=1;i<n;i++){
    		int u=read(),v=read();
    		insert(u,v);
    		insert(v,u);
    	}
    	for(i=1;i<=n;i++) a[i]=read();
    	dfs(1,0);
    	son[0]=1;
    	for(i=j=1;i<=n;i++,j++){
    		if(fa[a[i]]!=a[k]){
    			puts("No");
    			return 0;
    		}
    		if(j==son[a[k]]){
    			j=0;
    			k++;
    			while(son[a[k]]==0) k++;
    		}
    	}
    	puts("Yes");
    	return 0;
    }
    
  • 相关阅读:
    Spring格式化注解
    Mysql 慢查询和慢查询日志分析
    jQuery中的end()方法
    webService学习笔记
    让Hibernate和触发器协同工作
    JavaScript中的setInterval用法
    jQuery中事情的动态绑定
    mongoDB如何处理多对多关系
    新生儿信息管理系统在线帮助
    MySQL数据库安装与配置详解
  • 原文地址:https://www.cnblogs.com/LSlzf/p/11674861.html
Copyright © 2011-2022 走看看