zoukankan      html  css  js  c++  java
  • Parent and son

    Give you a tree with N vertices and N‐ 1 edges, and then ask you Q queries on “which vertex is Y's son that has the smallest number and which vertex is Y’s descendants that has the smallest number if we choose X as the root of the entire tree?”

    InputThe first line of input is an integer T (T<=10) means the case number. 
    The first line of each test case contains N(2 ≤ N ≤ 100,000) and Q(1 ≤ Q ≤ 100,000). 
    Each of the following N ‐ 1 lines of the test case contains two integers a(1 ≤ a ≤ N) and b(1 ≤ b ≤ N) indicating an edge between a and b. 
    Each of the following Q lines of the test case contains two integers X(1 ≤ X ≤ N) and Y(1 ≤ Y ≤ N, Y ≠ X) indicating an query. 
    OutputFor each query, output the Y's son which has the smallest number and Y's descendant that has the smallest number if X is the root of the entire tree. If Y has no sons then output “no answers!”. There is an empty line after each case.Sample Input

    1
    7 3
    1 2
    1 5
    2 3
    2 4
    5 6
    5 7
    1 2
    5 3
    3 2

    Sample Output

    3 3
    no answers!
    1 1


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<sstream>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<stack>
    #include<set>
    #include<memory>
    #include<bitset>
    #include<string>
    #include<functional>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    
    #define MAXN 100006
    #define INF 0x3f3f3f3f
    
    struct edge
    {
        int to, next;
    }E[MAXN*2];
    int tot, sz, head[MAXN], L[MAXN], R[MAXN], s[MAXN], fa[MAXN];
    void init()
    {
        tot = 0;
        sz = 0;
        memset(head, -1, sizeof(head));
        memset(s, 0, sizeof(s));
    }
    void addedge(int f, int t)
    {
        E[tot].to = t;
        E[tot].next = head[f];
        head[f] = tot++;
    }
    struct node
    {
        int min1, min2, id1, id2;
    }sn[MAXN],st[MAXN];
    
    void getmin(node& tmp, int num, int v)
    {
        if (tmp.min1 > num)
        {
            tmp.min2 = tmp.min1, tmp.id2 = tmp.id1;
            tmp.min1 = num, tmp.id1 = v;
        }
        else if (tmp.min2 > num)
        {
            tmp.min2 = num, tmp.id2 = v;
        }
    }
    
    void dfs(int u, int pre)
    {
        L[u] = ++sz;
        sn[u].min1 = sn[u].min2 = st[u].min1 = st[u].min2 = INF;
        for (int i = head[u]; i != -1; i = E[i].next)
        {
            int v = E[i].to;
            if (v == pre) continue;
            dfs(v, u);
            fa[v] = u;
            getmin(sn[u], v, v);
            getmin(st[u], min(st[v].min1, v), v);
        }
        R[u] = sz;
    }
    int main()
    {
        int T, n, u, v, q, X, Y;
        scanf("%d", &T);
        while (T--)
        {
            scanf("%d%d", &n, &q);
            init();
            for (int i = 0; i < n - 1; i++)
            {
                scanf("%d%d", &u, &v);
                s[u]++;
                s[v]++;
                addedge(u, v);
                addedge(v, u);
            }
            sz = 0;
            fa[1] = INF;
            dfs(1, 0);
            while (q--)
            {
                scanf("%d%d", &X, &Y);
                if (s[Y] == 1)
                    printf("no answers!
    ");
                else if (L[X]<L[Y] || R[X]>R[Y])
                    printf("%d %d
    ", sn[Y].min1, st[Y].min1);
                else
                {
                    int ans = 1;
                    if (Y == 1)
                    {
                        if (L[st[Y].id1] <= L[X] && R[st[Y].id1] >= R[X])
                        {
                            ans = st[Y].min2;
                        }
                        else
                            ans = st[Y].min1;
                    }
                    if (L[sn[Y].id1] <= L[X] && R[sn[Y].id1] >= R[X])
                    {
                        printf("%d %d
    ", min(fa[Y], sn[Y].min2), ans);
                    }
                    else
                        printf("%d %d
    ", min(fa[Y], sn[Y].min1), ans);
                }
            }
            printf("
    ");
        }
    }
  • 相关阅读:
    attributeError:'module' object has no attribute ** 解决办法
    Pyqt+QRcode 生成 识别 二维码
    Pyqt 打包资源文件
    Pyqt 设置 背景颜色和背景图片、 QPalette 调色板 与QPainter 画板区别 、 不规则图片
    Pyqt清空Win回收站
    【转载】pyqt QTableWidget的使用
    Pyqt QComboBox 省市区县联动效果
    pyinstaller打包pyqt文件
    Qt Designer怎样加入资源文件
    【转载】 JQuery.Gantt(甘特图) 开发指南
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7375201.html
Copyright © 2011-2022 走看看