dfs 序

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

Tree Queries

题面翻译

给你一个以1为根的有根树.
每回询问k个节点v1,v2vk
求出是否有一条以根节点为一端的链使得询问的每个节点到此链的距离均1.
只需输出可行性, 无需输出方案.

题目描述

You are given a rooted tree consisting ofnvertices numbered from1ton. The root of the tree is a vertex number1.

A tree is a connected undirected graph withn1edges.

You are givenmqueries. Thei-th query consists of the set ofkidistinct verticesvi[1],vi[2],,vi[ki]. Your task is to say if there is a path from the root to some vertexusuch that each of the givenkvertices is either belongs to this path or has the distance1to some vertex of this path.

输入格式

The first line of the input contains two integersnandm(2n2105,1m2105) — the number of vertices in the tree and the number of queries.

Each of the nextn1lines describes an edge of the tree. Edgeiis denoted by two integersuiandvi, the labels of vertices it connects(1ui,vin,uivi).

It is guaranteed that the given edges form a tree.

The nextmlines describe queries. Thei-th line describes thei-th query and starts with the integerki(1kin) — the number of vertices in the current query. Thenkiintegers follow:vi[1],vi[2],,vi[ki](1vi[j]n), wherevi[j]is thej-th vertex of thei-th query.

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

It is guaranteed that the sum ofkidoes not exceed2105(i=1mki2105).

输出格式

For each query, print the answer — "YES", if there is a path from the root to some vertexusuch that each of the givenkvertices is either belongs to this path or has the distance1to 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 root1to the vertexu=10. Then vertices[3,9,10]belong to the path from1to10and the vertex8has distance1to the vertex7which also belongs to this path.

The second query is[2,4,6]. The answer is "YES" as you can choose the path to the vertexu=2. Then the vertex4has distance1to the vertex1which belongs to this path and the vertex6has distance1to the vertex2which belongs to this path.

The third query is[2,1,5]. The answer is "YES" as you can choose the path to the vertexu=5and 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 vertexu=9so vertices2and4both have distance1to the vertex1which belongs to this path and the vertex8has distance1to the vertex7which belongs to this path.

The fifth and the sixth queries both have answer "NO" because you cannot choose suitable vertexu.

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;
}
posted @   AC7  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示