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秒开始,在第 ...
随机推荐
- Python的题目
1.将元组 (1,2,3) 和集合 {4,5,6} 合并成一个列表.2.在列表 [1,2,3,4,5,6] 首尾分别添加整型元素 7 和 0.3.反转列表 [0,1,2,3,4,5,6,7] .4.反 ...
- java——HttpClient 代理模式发送Http Https
在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP. http很简单,但是https这样会报错. 问题:如何使用代理发送https请求? 客户端发送https请求之前会先向 ...
- 【leetcode】1224. Maximum Equal Frequency
题目如下: Given an array nums of positive integers, return the longest possible length of an array prefi ...
- Elasticsearch:aggregation介绍
聚合(aggregation)功能集是整个Elasticsearch产品中最令人兴奋和有益的功能之一,主要是因为它提供了一个非常有吸引力对之前的facets的替代. 在本教程中,我们将解释Elasti ...
- python3---99乘法表
参考: http://www.cnblogs.com/suiy-160428/p/5594389.html #!/usr/bin/env pythonfor i in range(1,10): for ...
- Oracle开发:常用的数据库字段类型[转]
Oracle常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes ...
- POST上传多张图片配合Django接受多张图片
POST上传多张图片配合Django接受多张图片 本地:POST发送文件,使用的是files参数,将本地的图片以二进制的方式发送给服务器. 在这里 files=[("img",op ...
- React Native商城项目实战05 - 设置首页的导航条
1.Home.js /** * 首页 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Te ...
- java 解析上传的Excel文件
java poi解析上传的Excel文件 package com.zhl.push.Utils; /** * @Author TAO * @ClassName ExcelData * @Descrip ...
- JS中数组的拷贝方法
之前在写一个vue的计算属性时,大概是这样: computed: { updateList () { let newList = this.List /*do something*/ return n ...