SAC E#1 - 一道难题 Tree(树形DP)
题目背景
冴月麟和魏潇承是好朋友。
题目描述
冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了。任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索。
她设置了一棵树(有根)。树的每一条边上具有割掉该边的代价。
魏潇承需要计算出割开这棵树的最小代价,这就是冴月麟和魏潇承约定的小秘密。
帮帮魏潇承吧。
注:所谓割开一棵有根树,就是删除若干条边,使得任何任何叶子节点和根节点不连通。
输入输出格式
输入格式:
输入第一行两个整数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",<t,&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)的更多相关文章
- 「洛谷P3931」 SAC E#1 - 一道难题 Tree
P3931 SAC E#1 - 一道难题 Tree 题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是 ...
- 2018.09.14 洛谷P3931 SAC E#1 - 一道难题 Tree(树形dp)
传送门 简单dp题. f[i]表示以i为根的子树被割掉的最小值. 那么有: f[i]=min(∑vf[v],dist(i,fa))" role="presentation" ...
- SAC E#1 - 一道难题 Tree
题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索. 她设置了一棵树( ...
- [洛谷P3931]SAC E#1 - 一道难题 Tree
题目大意:给你一棵带权有根树,可以切断一些边,问使得根和叶子节点不连通的最小代价. 题解:做了一天的网络流,这道题显然可以用最小割来做,但是也可以用树形$DP$,基本同[SDOI2011]消耗战,这道 ...
- 【题解】Luogu P3931 SAC E#1 - 一道难题 Tree
原题传送门 题目几乎告诉你要用最大流 先进行搜索,将树的叶子节点都连到一个虚拟点T上,流量为inf(这样不会干扰到前面部分的最大流) 其他边按树的形态连边,以根节点为S,跑一变最大流即可求出答案 #i ...
- 【luogu P3931 SAC E#1 - 一道难题 Tree】 题解
题目链接:https://www.luogu.org/problemnew/show/P3931 肉眼观察题目感觉可以跑最大流. 证明是如果拆断一棵树,可以最小割,最小割等于最大流. 注意: 图是无向 ...
- 洛谷 P3931 SAC E#1 - 一道难题 Tree
题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索. 她设置了一棵树( ...
- 「Luogu P3931」SAC E#1 - 一道难题 Tree 解题报告
圆原题面 我环顾四周,发现大佬们的写法都好高端! 比较差劲的我,只能交上一份DFS的题解 思路: DFS(当然了,其他算法也行) 要想切断叶子节点到根节点的连接 就是在叶子节点和根节点之间砍掉一条边 ...
- 【题解】SAC E#1 - 一道难题 Tree
Problem is here \(\text{Solution:}\) 首先,一眼看出这是最小割,只要叶子节点对汇点\(T\)连接流量为\(inf\)的边就可以一遍最大流搞定了. 剩下的问题在于,如 ...
随机推荐
- java消息中间件 RocketMQ Linux安装与运行
阿里巴巴宣布捐赠RocketMQ到Apache软件基金会孵化项目,最近闲下来便去部署了一个试验版本玩玩. 至于RockeMQ是什么,原理架构什么的这里就不赘述了,这里只记录安装过程. 一.系统环境 s ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- arcgis版接合图表5.2 免费软件,支持国家2000坐标系,ArcGIS10.0,ArcGIS10.1,ArcGIS10.2都可以使用
下载地址:http://files.cnblogs.com/gisoracle/jionmap52.rar 1. 国家2000,西安80,北京54.坐标系的接合图表生成.根据经纬度范围,坐标 ...
- 【Linux】TFTP & NFS 服务器配置
Why?--交叉开发 一.交叉开发模型 宿主机(PC)------ 网络.串口.USB.JTAG ------ 目标机(ARM系统) PC机作为TFTP & NFS 服务器,目标机从网络下载软 ...
- ImageLoader简单使用
效果图就是一个从网络加载的图片:在加载的时候图片的中间显示一个进度条 数据是随便找的一个网络图片的地址 导入jar包universal-image-loader-1.9.5 用来展示商品使用 在 ...
- 增强for循环 java.util.ConcurrentModificationException
Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元 ...
- Computer Hardware
Computer Hardware Para 1 Computer hardware can be divides into four categories: input hardware, stor ...
- POJ 2942 圆桌骑士
之前做过这个题目,现在回想起来,又有新的柑橘. 求必须出去的骑士人数. 每一个双连通分量,如果是一个奇圈,那么一定是二分图染色失败. 依次遍历每个双连通分量,但是,对于邻接表中,有一些点不是双连通分量 ...
- 【转】Activity、Window、View的关系
1.先看一个现象 1 2 3 4 5 6 7 8 9 10 11 public class MainActivity extends Activity { @Override pr ...
- ART_20190430
Algorithm-算法题 第一个只出现一次的字符 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要 ...