• 祖孙询问


    Description

    已知一棵n个节点的有根树。有m个询问。每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系。

    Input
    输入第一行包括一个整数n表示节点个数。
    接下来n行每行一对整数对a和b表示a和b之间有连边。如果b是-1,那么a就是树的根。
    第n+2行是一个整数m表示询问个数。
    接下来m行,每行两个正整数x和y。

    Output
    对于每一个询问,输出1:如果x是y的祖先,输出2:如果y是x的祖先,否则输出0。

    Sample Input

    10
    234 -1
    12 234
    13 234
    14 234
    15 234
    16 234
    17 234
    18 234
    19 234
    233 19
    5
    234 233
    233 12
    233 13
    233 15
    233 19

    Sample Output
    1
    0
    0
    0
    2

    Data Constraint

    Hint
    对于100%的.据,n,m≤40000,每个节点的编号都不超过40000。
    .
    .
    .
    .
    .
    .

    分析

    DFS遍历树,记录每个点X的第一次访问时间st[a]和最后一次访问时间ed[a],若y在以X为根的子树中,则一定有st[a]

    程序:
    
        while i>0 do
        begin
            dfs(v[i],dep+1);
            i:=next[i];
        end;
        inc(p);
        en[node]:=p;
    end;
    
    begin
        readln(n);
        for i:=1 to n do
        begin
            readln(v[i],u[i]);
            if u[i]=-1 then root:=v[i] else
            begin
                next[i]:=list[u[i]];
                list[u[i]]:=i;
            end;
        end;
        dfs(root,1);
        readln(m);
        for i:=1 to m do
        begin
            readln(a,b);
            if (st[b]<st[a])and(st[a]<en[a])and(en[a]<en[b]) then writeln(2) else
            if (st[a]<st[b])and(st[b]<en[b])and(en[b]<en[a]) then writeln(1) else writeln(0);
        end;
    end.
  • 相关阅读:
    LeetCode #4 中等题(二分,中位数)
    LeetCode #3 简单题(map标记)
    leetCode #2 简单题(链表)
    LeetCode #1 简单题(map存一下基本就O(nlogn)复杂度)
    CMake使用入门笔记( 1 ) BuildSystem的三个指令 --- 更新中
    (模拟)hihocoder
    (暴力)UVA
    (IDA*)HDU
    总结
    (模拟+贪心)codeforces
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499961.html
Copyright © 2020-2023  润新知