E. Tree Queries 题解(思维+dfs序)
题目链接
题目思路
这个题意显然不当人,要转换下题意就能变的简单
即所有节点的父亲节点是否再同一条链上,有很多种写法,
最简便的就是利用dfs序判断即可
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n,m,cnt;
int a[maxn];
vector<int> g[maxn];
int in[maxn],out[maxn];
int dad[maxn];
void dfs(int u,int fa){
dad[u]=fa;
in[u]=++cnt;
for(auto x:g[u]){
if(x==fa) continue;
dfs(x,u);
}
out[u]=cnt;
}
bool cmp(int x,int y){
return in[x]<in[y];
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=n-1;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,1);
for(int i=1,k;i<=m;i++){
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d",&a[j]);
a[j]=dad[a[j]];
}
sort(a+1,a+1+k,cmp);
bool flag=1;
for(int j=2;j<=k;j++){
if(in[a[j]]>out[a[j-1]]||in[a[j]]<in[a[j-1]]){
flag=0;
break;
}
}
printf(flag?"YES\n":"NO\n");
}
return 0;
}
不摆烂了,写题