• URAL 1056 Computer Net


        对于树上任意一点来讲,相距最远的点要么是从父节点走过来的,要么就是从儿子节点中走过来。因此可以先进行一次自下向上的dp,处理出从儿子节点过来的最远点的距离。然后再进行一次自上而下的dp,同时传入从父亲节点过来时最远点的距离,这样和从儿子节点过来的最远点的距离对比一下,就可以找到距这个点最远的点的距离了。

    INF = 0x3f3f3f3f
    N = 0
    g = [[]]
    dp = []
    ans = []
    res = 0
    
    def input():
        global N, g
        N = int(raw_input())
        g = [[] for i in range(N + 1)]
        for i in range(2, N + 1):
            x = int(raw_input())
            g[x].append(i), g[i].append(x)
    
    def bottom_up(x, px):
        global dp, g
        dp[x] = 0
        for y in g[x]:
            if y == px: continue
            bottom_up(y, x)
            dp[x] = max(dp[x], dp[y] + 1)
    
    def top_down(x, px, dis):
        global dp, res, ans, g
        t = max(dp[x], dis)
        if t < res:
            res = t
            ans = [x]
        elif t == res: ans.append(x)
        opt = [dp[i] + 1 for i in g[x]]
        for i in range(len(opt) - 2, -1, -1):
            opt[i] = max(opt[i], opt[i + 1])
        i = 0
        t = dis
        for y in g[x]:
            i += 1
            if y == px: continue
            ndis = t
            if i < len(opt) and opt[i] > ndis: ndis = opt[i]
            top_down(y, x, ndis + 1)
            t = max(t, dp[y] + 1) 
    
    def process():
        global N, dp, res, ans
        dp = [-1 for i in range(N + 1)]
        bottom_up(1, -1)
        res = 0x3f3f3f3f
        top_down(1, -1, 0)
        ans.sort()
        for i in ans: print i,
        print
    
    #main
    input()
    process()
  • 相关阅读:
    a标签点击之后有个虚线边框,怎么去掉
    在ie下,a标签包被img的时候,为什么有个蓝色的边线
    如何让一个变量的值,作为另一个变量的名字
    html 获取宽高
    两个同级div等高布局
    java中IO流异常处理
    连带滑块效果图
    java中File类的使用
    java保留两位小数4种方法
    java日历显示年份、月份
  • 原文地址:https://www.cnblogs.com/staginner/p/2962359.html
Copyright © 2020-2023  润新知