树形dp 1272 2986

 

n,p=map(int,input().split())

l=[[] for i in range (n+1)]
for i in range(n-1):
    a,b=map(int,input().split())
    l[a].append(b)
dp=[[float("inf") for i in range(p+1)] for i in range(n+1)]

def dfs(x):
    dp[x][1]=len(l[x])
    if not l[x]:
        return
    for i in l[x]:
        dfs(i)
        for j in range(p,1,-1):
            for k in range(1,p):
                if (k>j-1):break
                dp[x][j]=min(dp[x][j],dp[x][j-k]+dp[i][k]-1)
dfs(1)
ans=dp[1][p]

for i in range(2,n+1):
    ans=min(ans,dp[i][p]+1)
print(ans)

 

 

import sys
sys.setrecursionlimit(10000000)


n=int(input())
nn=[0]
for i in range(n):
    nn.append(int(input()))
cnt=0
ss=sum(nn)
line=[0]
class node :
    def __init__(self,v,w,ne):
        self.v=v
        self.w=w
        self.ne=ne

dp=[0 for i in range(n+1)]
h=[0 for i in range(n+1)]
for i in range(n-1):
    a,b,l=map(int,input().split())
    cnt+=1
    line.append(node(b,l,h[a]))
    h[a]=cnt
    cnt+=1
    line.append(node(a,l,h[b]))
    h[b]=cnt

def dfs1(x,fa):

    ind=h[x]
    while (ind!=0):
        ll=line[ind]
        if (ll.v==fa):
            ind=ll.ne
            continue
        dfs1(ll.v,x)
        nn[x]+=nn[ll.v]
        dp[x]+=dp[ll.v]
        dp[x]+=ll.w*nn[ll.v]
        ind=ll.ne
dfs1(1,-1)
ans=dp[1]

def dfs2(x,fa):
    global ans

    ind = h[x]
    while (ind != 0):
        ll = line[ind]
        if (ll.v == fa):
            ind = ll.ne
            continue
        dp[ll.v]=dp[x]+(ss-nn[ll.v])*ll.w-nn[ll.v]*ll.w

        ans=min(ans,dp[ll.v])
        dfs2(ll.v,x)
        ind = ll.ne

dfs2(1,-1)
print(ans)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值