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的更多相关文章

  1. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  2. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  3. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  4. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  5. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  6. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  7. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  8. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  9. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

随机推荐

  1. 【NOIP2016提高A组模拟9.24】天使的分裂

    题目 分析 这题可以递推, 但是\(O(n)\)还是会超时, 就用矩阵快速幂. #include <cmath> #include <iostream> #include &l ...

  2. cast() 函数进行类型转换

    service_fee  字段定义:`service_fee`  decimal(14,4) NULL DEFAULT NULL COMMENT '手续费金额,含税' , 需求:service_fee ...

  3. html aside标签 语法

    html aside标签 语法 aside是什么意思? aside为语义化标签,通常用来描述与文档主体内容不相关的内容,其aside标签的内容应该与附近的内容相关. 作用:定义其所处内容之外的内容.直 ...

  4. python实现的ocr接口

    太累了,,有时间再补解释 import pytesseract import requests from PIL import Image from PIL import ImageFilter fr ...

  5. cin.clear()、cin.sync()

    看机器学习时,发现之前学的C++代码忘了,cin.clear().cin.sync() cin.clear():将流中的所有状态值都重设为有效值 cin.sync():清空流 这个很有意思,如果没有c ...

  6. linux系统安装Oracle11g详细步骤

    快速安装指引 ■Reviewing Information About This Guide■Logging In to the System as root 以root用户登录系统■Checking ...

  7. HTTP深入浅出http请求(转)-----http请求的过程和实现机制

    摘要:此文章大概讲明了http请求的过程和实现机制,可以作为了解,至于请求头和响应头的具体信息需要查看下一篇随笔:Http请求详解(转)----请求+响应各字段详解   HTTP(HyperText ...

  8. [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)

    题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: .相互憎恨的两个骑士不能坐在直接相邻的 ...

  9. 阿里菜鸟知识储备之二——git工具学习

    具体的可以参见这篇博客: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1,什么 ...

  10. C/C++题库

    1.下面的代码输出什么?为什么? void foo(void) { unsigned int a = 6; int b = -20; (a+b > 6)?puts(“>6”):puts(“ ...