dfs 序
dfs序可以 判断树上两个点的从属关系
Tree Queries
题面翻译
给你一个以
每回询问
求出是否有一条以根节点为一端的链使得询问的每个节点到此链的距离均
只需输出可行性, 无需输出方案.
题目描述
You are given a rooted tree consisting of
A tree is a connected undirected graph with
You are given
输入格式
The first line of the input contains two integers
Each of the next
It is guaranteed that the given edges form a tree.
The next
It is guaranteed that all vertices in a single query are distinct.
It is guaranteed that the sum of
输出格式
For each query, print the answer — "YES", if there is a path from the root to some vertex
样例 #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
The second query is
The third query is
The fourth query is
The fifth and the sixth queries both have answer "NO" because you cannot choose suitable vertex
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】