Rinne Loves Edges(树树树树形dp12138)

题目

题意:

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

思路:

先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;
}

猜你喜欢

转载自blog.csdn.net/ACkingdom/article/details/105860822