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秒开始,在第 ...
随机推荐
- Comet OJ - Contest #8 E.神奇函数
旧题解:https://blog.csdn.net/gmh77/article/details/99066792#commentBox 之前写的有些奇怪,不能体现这道题的sb所以再推一遍 \(\bec ...
- Windows 环境上域名配置
1.Hosts位置 C:\Windows\System32\drivers\etc\hosts 2.Hosts内容 # Copyright (c) 1993-2009 Microsoft Corp. ...
- Ubuntu16.04 同时连接无线网络和以太网端口
背景: 激光雷达VLP16通过以太网线连接电脑.在本博客所述的设置之前,一旦连接以太网线,本机(dell笔记本)的无线网络立即断开,即无法同时连接无线网络和以太网端口. 问题查找: 命令行 $ ip ...
- 4.Python IDLE使用方法详解(包含常用快捷键)
在安装 Python 后,会自动安装一个 IDLE,它是一个 Python Shell (可以在打开的 IDLE 窗口的标题栏上看到),程序开发人员可以利用 Python Shell 与 Python ...
- Vue.use源码分析(转)+如何封装一个组件
封装一个组件:https://www.jianshu.com/p/89a05706917a 我想有过vue开发经验的,对于vue.use并不陌生.当使用vue-resource或vue-router等 ...
- vim编辑器快捷键
光标控制命令 命令 光标移动 h或^h 向左移一个字符 j或^j或^n 向下移一行 k或^p 向上移一行 l或空格 向右移一个字符 G 移到文件的最后一行 nG 移到文件的第n行 w 移到下一个字的开 ...
- HDU 2243 ( Trie图 矩阵构造幂和 )
题意 : 长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义. 比如一共有2个词根 aa 和 ab ,则可能存在104个长度不超过3的单词, ...
- QPS、TPS、PV、UV、GMV、IP、RPS
摘自:https://www.citrons.cn/jishu/226.html 关于 QPS.TPS.PV.UV.GMV.IP.RPS 这些词语,看起来好像挺专业.但实际上,我认为是这是每个程序员必 ...
- getBoundingClientRect 和 requestAnimFrame 的polyfill
概述 今天在项目中用到了 getBoundingClientRect 和 requestAnimFrame ,查了下它们的polyfill,记录下来,供以后开发时参考,相信对其他人也有用. getBo ...
- webService框架CXF的简单使用
最近本来已经将上一个项目交活,全身心投入了另外项目的前端的开发工作.可之前的项目经理通知我,之前的项目需要做一个webService的功能,于是稍微做了一下webService,可是忘了通知我现在的项 ...