蓝桥杯 Python 练习题 节点选择70%

试题 算法训练 结点选择

提交此题   评测记录  

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?

输入格式

第一行包含一个整数 n 。

接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

接下来一共 n-1 行,每行描述树上的一条边。

输出格式

输出一个整数,代表选出的点的权值和的最大值。

样例输入

5
1 2 3 4 5
1 2
1 3
2 4
2 5

样例输出

12

样例说明

选择3、4、5号点,权值和为 3+4+5 = 12 。

数据规模与约定

对于20%的数据, n <= 20。

对于50%的数据, n <= 1000。

对于100%的数据, n <= 100000。

权值均为不超过1000的正整数。


def get(n):
    global tree
    tree={}
    for i in range(n-1):
        a,b=list(map(int,input().split()))
        tree[a]=tree.get(a,[])
        tree[b]=tree.get(b,[])
        '''
        if not tree.get(a):
            tree[a]=[]
        if not tree.get(b):
            tree[b]=[]
        '''
        tree[a].append(b)
        tree[b].append(a)
        #print(tree)
def dfs(f):
    global dp
    
    '''
    flag=[1]
    memory=[1]
    while(len(flag)>0):
        x=flag.pop()
        y=tree[x]
        for i in y:
            if i not in memory:
                flag.append(i)
                memory.append(i)
    dp[1][n]=weight[-1]
    '''
    memory[f]=1
    dp[1][f]+=weight[f]
    for i in range(len(tree[f])):
        son=tree[f][i]
        if(memory[son]==1):
            continue
        dfs(son)
        dp[0][f]+=max(dp[0][son],dp[1][son])
        dp[1][f]+=dp[0][son]
        #print(f,son,dp[0][f],dp[1][f])

n=int(input())
weight=list(map(int,input().split()))
weight.insert(0,0)
dp=[[0 for _ in range(n+1)]for _ in range(2)]
memory=[0 for _ in range(n+1)]
get(n)
dfs(1)
#print(dp,memory)
print(max(dp[0][1],dp[1][1]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值