Rinne Loves Edges(树树树树形dp12138)

本文介绍了一种基于深度优先搜索(DFS)的算法,用于解决在给定树形结构中,从特定根节点出发,移除最少边权以使所有叶子节点无法到达根节点的问题。通过从叶子节点向上递归比较,最终确定达到根节点所需的最小边权总和。

题目

题意:

给定一个树,再给你一个根节点,要求去掉最少的边权,使得所有的叶子节点都无法到达根节点。

思路:

先dfs,从叶子节点开始往上一层一层比较,将某个节点所连接的所有叶子节点所需要去掉的最小边权与该节点与父节点连接的边的边权所比较,最小值加到该节点的父节点所连接的叶子节点所需要去掉的最小边权上,这样一层一层递归到根节点时就可得出结果。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
const int inf=0x3f3f3f3f;
int n,m,s,head[N],nex[N],to[N],weight[N],tou=0,value[N],du[N];
int add(int a,int b,int c)
{
    to[tou]=b,weight[tou]=c,nex[tou]=head[a],head[a]=tou++;
}
void dfs(int u,int fa)
{
    if(du[u]==1&&u!=s)
    {
        value[u]=inf;
        return ;
    }
    for(int i=head[u];~i;i=nex[i])
    {
        int j=to[i],w=weight[i];
        if(j==fa)
        {
            continue;
        }
        dfs(j,u);
        value[u]+=min(value[j],w);
    }
}
signed main()
{
    memset(head,-1,sizeof head);
    cin>>n>>m>>s;
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
        du[a]++;du[b]++;
    }
    dfs(s,-1);
    cout<<value[s]<<endl;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值