题目背景

冴月麟和魏潇承是好朋友。

题目描述

冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了。任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索。

她设置了一棵树(有根)。树的每一条边上具有割掉该边的代价。

魏潇承需要计算出割开这棵树的最小代价,这就是冴月麟和魏潇承约定的小秘密。

帮帮魏潇承吧。

注:所谓割开一棵有根树,就是删除若干条边,使得任何任何叶子节点和根节点不连通。

输入输出格式

输入格式:

输入第一行两个整数n,S表示树的节点个数和根。

接下来n-1行每行三个整数a、b、c,表示a、b之间有一条代价为c的边。

输出格式:

输出包含一行,一个整数,表示所求最小代价。

思路:

好坑啊。。。空间卡的好严,用定长数组存边调了半天才卡过去

这道题很多人用的费用流,但我不会

很多人用的邻接表,但我比较懒

这道题其实我们可以这样想:

因为这是一棵树,所以我们可以想到树形DP

我们从根节点往下走,一直到叶子节点

因为要求的是割掉所有子结点,那么我们有两种选择

要么割掉这个子节点上连的边

要么割掉某个与他祖先连的边

于是,我们的DP数组表示的就是在i点时,割掉与他所辖的所有的叶子节点的最小代价

怎么转移呢?

我们知道从一个祖先点往下,如果想要割掉他的所有子树所辖的所有子节点

要么割掉他与那个子树相连那条边

要么我们割掉与子树相连的所有非返祖边

这样就是一个DP

每次枚举子树

要么割掉边,要么割掉子树

取最小代价

一层层递归向上

根节点就是答案

代码:

#include<iostream>
#include<cstdio>
#define rii register int i
using namespace std;
struct bian{
int to[],sl;
long long val[];
}x[];
long long dp[],n,root;
void dplast(int wz,int fa)
{
if(x[wz].sl==)
{
return;
}
for(rii=;i<=x[wz].sl;i++)
{
if(x[wz].to[i]!=fa)
{
dplast(x[wz].to[i],wz);
dp[wz]+=min(x[wz].val[i],dp[x[wz].to[i]]);//更新答案,要么加上这条边,要么加上子节点以下的删除代价
}
}
}
int main()
{
scanf("%lld%lld",&n,&root);
for(rii=;i<=n-;i++)
{
long long ltt,kkk,val;
scanf("%lld%lld%lld",&ltt,&kkk,&val);
x[ltt].sl++;
x[ltt].to[x[ltt].sl]=kkk;
x[ltt].val[x[ltt].sl]=val;
x[kkk].sl++;
x[kkk].to[x[kkk].sl]=ltt;
x[kkk].val[x[kkk].sl]=val;
}
for(rii=;i<=n;i++)
{
if(x[i].sl==&&i!=root)
{
dp[i]=<<;//初始化,因为不可能割掉叶子结点的子节点(不存在),所以赋值为无穷大(这里我设成1<<25)
}
}
dplast(root,);
cout<<dp[root];
}

SAC E#1 - 一道难题 Tree(树形DP)的更多相关文章

  1. 「洛谷P3931」 SAC E#1 - 一道难题 Tree

    P3931 SAC E#1 - 一道难题 Tree 题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是 ...

  2. 2018.09.14 洛谷P3931 SAC E#1 - 一道难题 Tree(树形dp)

    传送门 简单dp题. f[i]表示以i为根的子树被割掉的最小值. 那么有: f[i]=min(∑vf[v],dist(i,fa))" role="presentation" ...

  3. SAC E#1 - 一道难题 Tree

    题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索. 她设置了一棵树( ...

  4. [洛谷P3931]SAC E#1 - 一道难题 Tree

    题目大意:给你一棵带权有根树,可以切断一些边,问使得根和叶子节点不连通的最小代价. 题解:做了一天的网络流,这道题显然可以用最小割来做,但是也可以用树形$DP$,基本同[SDOI2011]消耗战,这道 ...

  5. 【题解】Luogu P3931 SAC E#1 - 一道难题 Tree

    原题传送门 题目几乎告诉你要用最大流 先进行搜索,将树的叶子节点都连到一个虚拟点T上,流量为inf(这样不会干扰到前面部分的最大流) 其他边按树的形态连边,以根节点为S,跑一变最大流即可求出答案 #i ...

  6. 【luogu P3931 SAC E#1 - 一道难题 Tree】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3931 肉眼观察题目感觉可以跑最大流. 证明是如果拆断一棵树,可以最小割,最小割等于最大流. 注意: 图是无向 ...

  7. 洛谷 P3931 SAC E#1 - 一道难题 Tree

    题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索. 她设置了一棵树( ...

  8. 「Luogu P3931」SAC E#1 - 一道难题 Tree 解题报告

    圆原题面 我环顾四周,发现大佬们的写法都好高端! 比较差劲的我,只能交上一份DFS的题解 思路: DFS(当然了,其他算法也行) 要想切断叶子节点到根节点的连接 就是在叶子节点和根节点之间砍掉一条边 ...

  9. 【题解】SAC E#1 - 一道难题 Tree

    Problem is here \(\text{Solution:}\) 首先,一眼看出这是最小割,只要叶子节点对汇点\(T\)连接流量为\(inf\)的边就可以一遍最大流搞定了. 剩下的问题在于,如 ...

随机推荐

  1. 写C#代码时用到的中文简体字 、繁体字 对应的转化 (收藏吧)

    简体字    下面有与之对应的繁体字 private const String Jian = "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆疤巴拔跋靶 ...

  2. Spring学习笔记:Spring概述,第一个IoC依赖注入案例

    一.Spring的优点 企业及系统: 1.大规模:用户数量多.数据规模大.功能众多 2.性能和安全要求高 3.业务复杂 4.灵活应变 Java技术:高入侵式依赖EJB技术框架-->Spring框 ...

  3. Implementation: Quick Sort 2014-08-19

    #include <stdio.h> void print(int *a, int start , int end); void quick_sort(int *a, int start, ...

  4. mysql四-1:单表查询

    一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键 ...

  5. centOs升级

    因为军佬放弃制作Centos7的网络重装包,又Centos7的安装引导和6有较大区别所以,选择曲线救国(技术不行,只能这样乱搞)前文:Centos6.9一键重装包https://ppx.ink/net ...

  6. webstorm 配置Vue.js 语法提示

    标签属性 v-text v-html v-once v-if v-show v-else v-for v-on v-bind v-model v-ref v-el v-pre v-cloak v-on ...

  7. scale 和 zoom,以及zoom的一些变态用法

    zoom和scale这两个东西都是用于对元素的缩放,一下是其中一些区别: 1.scale的缩小是以图片的中心,zoom的缩小是以图片的左上角. 2.zoom的缩放改变了元素占据的空间大小:而scale ...

  8. MicroService

  9. 转:什么是4D(DRG、DLG、DOM、DEM)数据?

    ps:摘抄地址http://blog.163.com/wangqing_rs/blog/static/16451519120111026102916472/  什么是4D(DRG.DLG.DOM.DE ...

  10. Linux漏洞分析入门笔记-Off-By-One(栈)

    ubuntu-16.04.5(X86) IDA7.0 0x00.漏洞描述 1.什么是off by one?又称1字节溢出. 源字符串长度等于目标缓冲区长度时,将源字符串复制到目标缓冲区可能会导致off ...