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
":"NO
");
    }
    return 0;

}


不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15407429.html