虚树(树形dp套路)模板——bzoj2286
虚树的核心就是把关键点和关键点的lca重新生成一棵树,然后在这棵树上进行dp
https://www.cnblogs.com/zwfymqz/p/9175152.html 写的很好的博客
建立虚树的核心代码
void insert(int x){
if(top==){stk[++top]=x;return;}
int lca=LCA(x,stk[top]);
if(lca==stk[top])return;//这里本来要stk[++top]=x的,但是由于本题特殊性,所以删去优化时间
while(top> && dfn[lca]<=dfn[stk[top-]])
add_edge(stk[top-],stk[top]),--top;
if(lca!=stk[top])//如果lca不是关键点,把它做成关键点,即把lca和栈顶元素连边,然后栈顶元素出栈,lca进栈
add_edge(lca,stk[top]),stk[top]=lca;
stk[++top]=x;
}
本题的ac代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 250005
#define ll long long
struct Edge{int to,nxt,w;}e[maxn<<];
int head[maxn],tot;
void add(int u,int v,int w){
e[tot].nxt=head[u];e[tot].to=v;e[tot].w=w;head[u]=tot++;
}
//树链剖分
ll Min[maxn];
int fa[maxn],son[maxn],topf[maxn],size[maxn],d[maxn],dfn[maxn],ind;
void dfs1(int u,int pre){
fa[u]=pre;size[u]=;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
d[v]=d[u]+;
Min[v]=min(Min[u],(ll)e[i].w);
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]])son[u]=v;
}
}
void dfs2(int u,int tp){
topf[u]=tp;dfn[u]=++ind;
if(!son[u])return;
dfs2(son[u],tp);
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(!topf[v])
dfs2(v,v);
}
}
//求lca
int LCA(int x,int y){
while(topf[x]!=topf[y]){
if(d[topf[x]]<d[topf[y]])
swap(x,y);
x=fa[topf[x]];
}
if(d[x]>d[y])swap(x,y);
return x;
}
//建立虚树 int top,stk[maxn];
vector<int>G[maxn];
void add_edge(int u,int v){G[u].push_back(v);} void insert(int x){
if(top==){stk[++top]=x;return;}
int lca=LCA(x,stk[top]);
if(lca==stk[top])return;
while(top> && dfn[lca]<=dfn[stk[top-]])//把lca以下的关键点都入栈
add_edge(stk[top-],stk[top]),--top;
if(lca!=stk[top])//如果lca不是关键点,把它做成关键点
add_edge(lca,stk[top]),stk[top]=lca;
stk[++top]=x;
}
//在虚树上dp
ll dfs3(int u){
if(G[u].size()==)return Min[u];
ll res=;
for(int i=;i<G[u].size();i++)
res+=dfs3(G[u][i]);
G[u].clear();
return min(res,Min[u]);
} int cmp(int a,int b){return dfn[a]<dfn[b];} int n,m,x,y,z,a[maxn]; int main(){
memset(head,-,sizeof head);
Min[]=1ll<<;
cin>>n;
for(int i=;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
d[]=;
dfs1(,),dfs2(,); cin>>m;
while(m--){
int k;scanf("%d",&k);
for(int i=;i<=k;i++)scanf("%d",&a[i]);
sort(a+,a++k,cmp);
top=;
stk[top]=;G[].clear(); for(int i=;i<=k;i++)insert(a[i]);
while(top)
add_edge(stk[top-],stk[top]),top--; //进行dp
cout<<dfs3()<<endl;
}
return ;
}
虚树(树形dp套路)模板——bzoj2286的更多相关文章
- 【BZOJ-2286】消耗战 虚树 + 树形DP
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2120 Solved: 752[Submit][Status] ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- 【BZOJ-3572】世界树 虚树 + 树形DP
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1084 Solved: 611[Submit][Status ...
- BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP+树剖lca
BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的 ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)
传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...
- BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 4261 Solved: 1552 [Submit][Sta ...
- 【BZOJ2286】【SDOI2011】消耗战 [虚树][树形DP]
消耗战 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一场战争中,战场由n个岛屿和n-1 ...
- 2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)
传送门 又一道虚树入门题. 这个dp更简单啊. 直接记录每个点到1的距离,简单转移就行了. 代码: #include<bits/stdc++.h> #define N 250005 #de ...
随机推荐
- Centos7搭建SkyWalking分布式追踪,以mysql为存储
Skywalking专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计.它通过探针自动收集所需的指标,并进行分布式追踪.通过 ...
- webpack配置(使用react,es6的项目)
const path = require('path');const webpack = require('webpack');const HtmlWebpackPlugin = require('h ...
- leetcood学习笔记-14*-最长公共前缀
笔记: python if not 判断是否为None的情况 if not x if x is None if not x is None if x is not None`是最好的写法,清晰,不 ...
- 生产者消费者模式-->线程
#_author:来童星#date:2019/12/17#生产者消费者模式-->线程from queue import Queueimport random,time,threading#生产者 ...
- Jenkins应用
转自 https://www.cnblogs.com/syw20170419/category/1239520.html Jenkins+Git+Python 进行持续集成接口测试 https://w ...
- 【JVM】符号引用和直接引用
在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...
- auth 模块使用篇
from django.cintrib import auth #登录模块 只要用auth模块一旦登录 就可以在项目的任意地方用request.user 拿到当前的用户对象 再通过 request ...
- thinkphp整合后台模板
将后台模板源码dist文件夹中的所有文件移动到thinkphp view index中 thinkphp的资源文件都不是从view文件夹下读取的 因此需要资源文件asset文件夹和demo文件夹放到t ...
- DOM学习总结(二)
一.什么是DOM属性 DOM属性简单来说就是HTML的属性值 二.常见的DOM属性有哪些? 1.innerHTML 属性 获取元素的内容,想要拿到某个元素的文本内容,直接在后面加 .innerHTML ...
- BZOJ 3771: Triple(FFT+容斥)
题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...