zoukankan      html  css  js  c++  java
  • Q Sta树的深度

    题目

    给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大

    Input

    给出一个数字N,代表有N个点.N<=1000000 下面N-1条边.

    Output

    输出你所找到的点,如果具有多个解,请输出编号最小的那个.

    Sample Input

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

    Sample Output

    7
    

    题解

    解题思路


    (下面的树没说明就是是以1为根)
    \(s(i)\) 表示的是以i为根的子树中节点个数,
    \(f(i)\)\(dfs1\)中表示以i为根的子树中节点的深度和,
    \(dfs2\)中表示以I为根的树的深度和,
    进过\(dfs1\)\(f(1)\) 已求出
    那么\(f(i)\)该怎么求呢?
    我们可以想到应该是子树的深度加上父亲及父亲连着的其他节点的深度
    子树每个节点的深度都比以父亲为根的小1,而父亲那里是多了1
    所以
    \(f(y) = f(x) - s(y) + (n - s(i))\)
    \(f(y) = f(x) + n - 2 * s(y)\)
    可以对照着图模拟一下

    代码

    #include <cstdio>
    using namespace std;
    const int N = 1e6+5;
    struct side {
        int t, next;
    }a[N*2];
    int tot, head[N];
    void add(int x, int y) {
        a[++tot].next = head[x];
        head[x] = tot;
        a[tot].t = y;
    }
    int n, d[N], s[N], ans;
    long long f[N];
    void dfs1(int x, int fa) {
        s[x] = 1;
        f[x] = d[x];
        for(int i = head[x]; i; i = a[i].next) {
            int y = a[i].t;
            if (y == fa) continue;
            d[y] = d[x] + 1;
            dfs1(y, x);
            f[x] += f[y];
            s[x] += s[y];
        }
    }
    void dfs2(int x, int fa) {
        for(int i = head[x]; i; i = a[i].next) {
            int y = a[i].t;
            if (y == fa) continue;
            f[y] = f[x] + n - 2 * s[y];
            dfs2(y, x);
        }
    }
    int main() {
        scanf("%d", &n);
        for(int i = 1, x, y; i < n; i++)
            scanf("%d%d", &x, &y),
            add(x, y), add(y, x);
        dfs1(1, -1);
        dfs2(1, -1);
        for(int i = 1; i <= n; i++)
            if (f[ans] < f[i]) ans = i;
        printf("%d", ans);
        return 0;
    }
    
  • 相关阅读:
    CSS3 Animation
    css形状大全
    HTML5 表单属性
    HTML5 Input 类型
    HTML 5 服务器发送事件
    jq制作博客已存在多少天
    Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
    Java网络编程和NIO详解3:IO模型与Java网络编程模型
    Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型
    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
  • 原文地址:https://www.cnblogs.com/shawk/p/12687923.html
Copyright © 2011-2022 走看看