JZOJ2678 树B
题
Description
已知无向连通图G由N个点,N-1条边组成。每条边的边权给定。现要求通过删除一些边,将节点1与另M个指定节点分开,希望删除的边的权值和尽量小,求此最小代价。
Input
每个输入文件中仅包含一个测试数据。
第一行包含两个整数N,M。
第二行至第N行每行包含3个整数,A、B、C,表示节点A与节点B有一条边相连,边权为C。
第N+1行至第N+M行每行包含一个整数X,表示要求与节点1分开的节点。
Output
输出文件仅包含一个整数,表示最小代价。
思路
树的遍历+DP
不知道为什么大家都喜欢叫树形DP,好高逼的感觉.害得我昨天那题一听是什么"树形DP"就不敢写了
对于每个必删的点 i ,很容易想到我们不必遍历以其为根的子树,
这样的情况花费是 cost[i]=E[V[i].dad->V[i]]
对于一个不必删的点 j ,
删掉其子树中所有必删的点的花费是
cost[j]=SUM(cost[儿子1]+cost[儿子2]+......+cost[儿子n]);
我们可以考虑删掉以其为根的子树,这样当然就删除了其子树中的所有必删点
花费 cost[j]=E[V[i].dad->V[i]]
考虑最小情况,所以点 n 的值应为 min(E[V[i].dad->V[i]],SUM(cost[儿子1]+cost[儿子2]+......+cost[儿子n]))
由于树的性质,每个点的DP值只给自己父亲用,所以不必存下,利用返回值带回即可.
代码(有问题欢迎讨论)
#include <iostream>
#include <algorithm>
using namespace std; int N,M; struct edge{int fr,to,vl;}E[];
int cmpS(edge m,edge n){return (m.fr==n.fr)?(m.to<n.to):(m.fr<n.fr);} struct node{int l,r,flag,vl;}V[]; int dfs(int dad,int dv,int id){//他老爸是谁(李刚) / 他到他老爸多远 / 他是谁
if(V[id].flag==)//要删就删,不多话
return dv;
int s=;//儿子的和SUM(没儿子返回0)
for(int i=V[id].l;i<=V[id].r;++i){
if(E[i].to!=dad){//你爸爸还是你爸爸,只能找自己儿子
s+=dfs(id,E[i].vl,E[i].to);
}
}
return min(dv,s);
} int main(){ // 输入数据
cin>>N>>M;
for(int i=;i<N;++i)//无向图存成两个有向边
cin>>E[i].fr>>E[i].to>>E[i].vl,E[N-+i]={E[i].to,E[i].fr,E[i].vl};
for(int i=,a;i<=M;++i)
cin>>a,V[a].flag=;//标记要删
// 初始化图
for(int i=;i<=N;++i)
V[i]={,-,V[i].flag,};
sort(&E[],&E[*N-],cmpS);
for(int i=;i<=*N-;++i){
if(E[i].fr!=E[i-].fr){
V[E[i].fr].l=i;
V[E[i-].fr].r=i-;
}
}
// 深搜/输出
cout<<dfs(,1e9,);//可怜的根节点没爸爸所以他离他爸很远(要不你当他爸做根节点//别打我) return ; }
能理解尽量自己码
淼仔mxxr第一次在博客写题解,大佬轻喷.
JZOJ2678 树B的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
随机推荐
- [机器学习]Fine Tune
Fine Tune顾名思义,就是微调.在机器学习中,一般用在迁移学习中,通过控制一些layer调节一些layer来达到迁移学习的目的.这样可以利用已有的参数,稍微变化一些,以适应新的学习任务.所以说, ...
- sqli-labs(26a)
0x01偷偷看一波源码 和26关一样 闭合变成了’)而已 0X01构造语句爆库名 这是百度到的 第一个 ' 首先闭合id='$id' 中的',%a0是空格的意思,(ps:此处我的环境是ubuntu14 ...
- [CSP-S模拟测试]:Walker(数学)
题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...
- 一、基础篇--1.1Java基础-重载和重写的区别
重载和重写的区别 重写: 1.也叫子类的方法覆盖父类的方法,要求返回值.方法名和参数都相同: 2.子类抛出的异常不能超过父类相应方法抛出的异常.(子类异常不能超出父类异常): 3.子类方法的的访问级别 ...
- Base64工具类并发问题!
为减少对象创建次数,一般会做如下编码: public class EncodeUtils { private static BASE64Encoder encoder; private static ...
- eigen 四元数进行坐标旋转
(<视觉SLAM十四讲>第三讲习题7)设有小萝卜一号和二号在世界坐标系中.一号位姿q1 = [0.35, 0.2, 0.3, 0.1],t1=[0.3, 0.1, 0.1].二号位姿q2= ...
- 清北学堂2019.7.18 & 清北学堂2019.7.19
Day 6 钟皓曦 经典题目:石子合并 可以合并任意两堆,代价为数量的异或(^)和 f[s]把s的二进制所对应石子合并成一堆所花代价 枚举s的子集 #include<iostream> u ...
- C/C++中的 void 和 void*
转自:https://blog.csdn.net/tonglin12138/article/details/86516789 写在前面:开门见山,大家看下面这个例子: unsigned char er ...
- ubuntu用mentohust连接ruijie
32位 http://download.csdn.net/detail/yan456jie/8720395 64位 http://download.csdn.net/detail/yan456jie ...
- Vue创建局部组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...