首页 > 其他分享 >dfs 序

dfs 序

时间:2022-11-07 11:57:42浏览次数:64  
标签:10 le vertex vertices dfs query path

dfs序可以\(O(1)\)判断书上两个点的从属关系

Tree Queries

题面翻译

给你一个以\(1\)为根的有根树.
每回询问\(k\)个节点\({v_1, v_2 \cdots v_k}\)
求出是否有一条以根节点为一端的链使得询问的每个节点到此链的距离均\(\leq 1\).
只需输出可行性, 无需输出方案.

题目描述

You are given a rooted tree consisting of\(n\)vertices numbered from\(1\)to\(n\). The root of the tree is a vertex number\(1\).

A tree is a connected undirected graph with\(n-1\)edges.

You are given\(m\)queries. The\(i\)-th query consists of the set of\(k_i\)distinct vertices\(v_i[1], v_i[2], \dots, v_i[k_i]\). Your task is to say if there is a path from the root to some vertex\(u\)such that each of the given\(k\)vertices is either belongs to this path or has the distance\(1\)to some vertex of this path.

输入格式

The first line of the input contains two integers\(n\)and\(m\)(\(2 \le n \le 2 \cdot 10^5\),\(1 \le m \le 2 \cdot 10^5\)) — the number of vertices in the tree and the number of queries.

Each of the next\(n-1\)lines describes an edge of the tree. Edge\(i\)is denoted by two integers\(u_i\)and\(v_i\), the labels of vertices it connects\((1 \le u_i, v_i \le n, u_i \ne v_i\)).

It is guaranteed that the given edges form a tree.

The next\(m\)lines describe queries. The\(i\)-th line describes the\(i\)-th query and starts with the integer\(k_i\)(\(1 \le k_i \le n\)) — the number of vertices in the current query. Then\(k_i\)integers follow:\(v_i[1], v_i[2], \dots, v_i[k_i]\)(\(1 \le v_i[j] \le n\)), where\(v_i[j]\)is the\(j\)-th vertex of the\(i\)-th query.

It is guaranteed that all vertices in a single query are distinct.

It is guaranteed that the sum of\(k_i\)does not exceed\(2 \cdot 10^5\)(\(\sum\limits_{i=1}^{m} k_i \le 2 \cdot 10^5\)).

输出格式

For each query, print the answer — "YES", if there is a path from the root to some vertex\(u\)such that each of the given\(k\)vertices is either belongs to this path or has the distance\(1\)to some vertex of this path and "NO" otherwise.

样例 #1

样例输入 #1

10 6
1 2
1 3
1 4
2 5
2 6
3 7
7 8
7 9
9 10
4 3 8 9 10
3 2 4 6
3 2 1 5
3 4 8 2
2 6 10
3 5 4 7

样例输出 #1

YES
YES
YES
YES
NO
NO

提示

The picture corresponding to the example:

Consider the queries.

The first query is\([3, 8, 9, 10]\). The answer is "YES" as you can choose the path from the root\(1\)to the vertex\(u=10\). Then vertices\([3, 9, 10]\)belong to the path from\(1\)to\(10\)and the vertex\(8\)has distance\(1\)to the vertex\(7\)which also belongs to this path.

The second query is\([2, 4, 6]\). The answer is "YES" as you can choose the path to the vertex\(u=2\). Then the vertex\(4\)has distance\(1\)to the vertex\(1\)which belongs to this path and the vertex\(6\)has distance\(1\)to the vertex\(2\)which belongs to this path.

The third query is\([2, 1, 5]\). The answer is "YES" as you can choose the path to the vertex\(u=5\)and all vertices of the query belong to this path.

The fourth query is\([4, 8, 2]\). The answer is "YES" as you can choose the path to the vertex\(u=9\)so vertices\(2\)and\(4\)both have distance\(1\)to the vertex\(1\)which belongs to this path and the vertex\(8\)has distance\(1\)to the vertex\(7\)which belongs to this path.

The fifth and the sixth queries both have answer "NO" because you cannot choose suitable vertex\(u\).

std

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+9;
int n,m;
int h[N],ver[N<<1],ne[N<<1],idx;
int dep[N],fa[N],dfn[N],sz[N],tim;
int k[N];

void add(int u,int v)
{
	idx++,ver[idx] = v,ne[idx] = h[u];h[u] = idx;
}

void dfs(int u,int pre)
{
	fa[u] = pre,dfn[u] = ++tim,dep[u] = dep[pre]+1,sz[u] = 1;
	for(int i = h[u];i;i= ne[i])
	{
		int v = ver[i];
		if(v == pre)continue;
		dfs(v,u);
		sz[u] += sz[v];
	}
}

bool cmp(int x,int y){return dep[x] > dep[y];}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1;i < n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	
	dfs(1,1);
	
	while(m--)
	{
		int t;
		scanf("%d",&t);
		for(int i = 1;i <= t;i++)scanf("%d",&k[i]),k[i] = fa[k[i]];
		sort(k+1,k+1+t,cmp);
		bool flag = 1;
		for(int i = 1;i < t;i++)
		{
			if(dfn[k[i]] > dfn[k[i+1]]+sz[k[i+1]]-1 || dfn[k[i]] < dfn[k[i+1]])
			{
				flag = 0;
				break;
			}
		}
		if(flag)printf("YES\n");
		else printf("NO\n");
	}
	
	return 0;
}

标签:10,le,vertex,vertices,dfs,query,path
From: https://www.cnblogs.com/AC7-/p/16865441.html

相关文章

  • 第2-1-3章 docker-compose安装FastDFS,实现文件存储服务
    目录4docker-compose安装FastDFS4.1docker-compose-fastdfs.yml4.2nginx.conf4.3storage.conf4.4测试4docker-compose安装FastDFS需要注意:network_mode必须是ho......
  • dfs序及其应用
    dfs序前置知识:线段树,树状数组,LCA,树的存储,树的基础问题类型1.点修改,子树查询2.子树修改,点查询3.子树修改,子树查询4.链修改,点查询5.点修改,链查询6.链修改,子树查询7.子树修改,......
  • 第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令
    目录3安装配置3.1安装GCC3.2安装libevent3.3安装libfastcommon3.4安装FastDFS3.5安装fastdfs-nginx-module3.5安装Nginx3.6配置FastDFSTracker3.5.1配置Tracker3......
  • 套汇问题 Python实现,算法设计,DFS深度遍历
    #P67#套汇问题可以理解为一个有向图找出环的问题,#要想有盈利,需要所有的汇率乘积大于1#在贪心条件下,找到一个环路径上的乘积大于1就有套汇的可能性"""#输入一......
  • Codeforces Round #826 (Div. 3) D. Masha and a Beautiful Tree(树+dfs)
    D.MashaandaBeautifulTree题目大意:给定一颗满二叉树的叶子节点,让我们更换子树位置,从而让叶子节点排序为升序求最小操作数,如果不能移动成那样的话,直接输出-1.in......
  • 数学 动规 滑动窗口 HashMap里放数组 dfs 暴力
    1比特与2比特字符intn=bits.length;inti=0;因为,如果最后一个字符必须是一个一比特字符,那么,一定可以跳到最会一个位置。也就是n-1这个位置。所以不能遍......
  • DFS
    概念其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.百度实现思想无向图通过转换为一个临界矩阵,其实就是遍历临界矩阵如上图......
  • 第2-1-1章 FastDFS分布式文件服务背景及系统架构介绍
    目录1背景1.1为什么需要分布式文件服务1.1.1单机时代1.1.2独立文件服务器1.1.3分布式文件系统1.2什么是FastDFS2系统架构2.1Tracker集群2.2Storage集群2.3Storag......
  • 浅谈 BFS 与 IDDFS
    前记为什么没有\(\text{CSDN}\)和博客园的同步输出了呢?因为博主懒得贴实践代码(实际上\(6\)种搜索的效率对比数据本人是有的),认为\(\text{CSDN}\)和博客园发博文不会......
  • HDFS接口编程 FDFS课堂测试
    调用HDFS文件接口实现对分布式文件系统中文件的访问,如创建、修改、删除等。  这个代码确实是有问题的,这个老师,有点内个  这老师有点不太靠谱啊,是不是写一个截图......