classroom(LCA)

在這裏插入圖片描述
代碼:

#include<bits/stdc++.h>
using namespace std;
vector<int> arr[100010];
int f[100010][22],dep[100010],fi[100010],dis,L;
void dfs(int u,int fa,int d){
    dep[u]=d,f[u][0]=fa;
    if(fa==1) fi[u]=u;
    else fi[u]=fi[fa];
    for(int i=1;i<=20;++i)
        f[u][i]=f[f[u][i-1]][i-1];
    for(auto v:arr[u])
        if(v!=fa) dfs(v,u,d+1);
}
int LCA(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    int d=dep[u]-dep[v];
    for(int i=20;i>=0&&u!=v;--i)
        if(d&(1<<i)) u=f[u][i];
    if(u==v) return v;
    for(int i=20;i>=0;--i)
        if(f[u][i]!=f[v][i])
            u=f[u][i],v=f[v][i];
    return f[u][0];
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;++i) arr[i].clear();
        for(int i=0;i<n-1;++i)
        {
            int x,y;
            cin>>x>>y;
            arr[x].push_back(y);
            arr[y].push_back(x);
        }
        dfs(1,0,0);
        while(k--)
        {
           int a,b,c;
           cin>>a>>b>>c;
           int l=LCA(b,c);
           int dis=dep[b]+dep[c]-2*dep[l];
           if(dep[a]<dis+dep[c]) puts("YES");
           else
           {
               int temp=LCA(a,c);
               if(dep[a]==dis+dep[c]&&temp!=1) puts("YES");
               else puts("NO");
           }
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章