BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2286
【题目大意】
出一棵边权树,每次给出一些关键点,求最小边割集,
使得1点与各个关键点不相连
【题解】
我们将所有关键点抽出构建虚树,记录每个点到根的最小边权,
在虚树上标记关键点,在虚树上做树形dp,
对于虚树上所有点,要么切断所有向下的路径,要么切断向上的路径,
对于被标记的关键点,一定是切断向上路径。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=250010;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
namespace Virtual_Tree{const LL INF=1LL<<60;LL mn[N];int ed,d[N],vis[N],f[N],size[N],son[N],w[N<<1];int nxt[N<<1],g[N],v[N<<1],st[N],en[N],dfn,top[N];void add_edge(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}void dfs(int x){size[x]=1;for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){mn[v[i]]=min(mn[x],(LL)w[i]);f[v[i]]=x,d[v[i]]=d[x]+1;dfs(v[i]),size[x]+=size[v[i]];if(size[v[i]]>size[son[x]])son[x]=v[i];}}void dfs2(int x,int y){if(x==-1)return;st[x]=++dfn;top[x]=y;if(son[x])dfs2(son[x],y);for(int i=g[x];i;i=nxt[i])if(v[i]!=son[x]&&v[i]!=f[x])dfs2(v[i],v[i]);en[x]=dfn;}int lca(int x,int y){for(;top[x]!=top[y];x=f[top[x]])if(d[top[x]]<d[top[y]]){int z=x;x=y;y=z;}return d[x]<d[y]?x:y;}void Initialize(){ mn[1]=INF;memset(g,dfn=ed=0,sizeof(g));memset(v,0,sizeof(v));memset(nxt,0,sizeof(nxt));memset(son,-1,sizeof(son));}int V[N<<1],NXT[N<<1],G[N],ED,a[N],q[N],mark[N];void ADD_edge(int x,int y){V[++ED]=y;NXT[ED]=G[x];G[x]=ED;}bool cmp(int a,int b){return st[a]<st[b];}LL dp[N]; void DP(int x){dp[x]=mn[x];LL tmp=0;for(int i=G[x];i;i=NXT[i]){ DP(V[i]);if(mark[V[i]])tmp+=mn[V[i]];else tmp+=dp[V[i]];}G[x]=0;if(tmp==0)dp[x]=mn[x];else if(tmp<=dp[x])dp[x]=tmp;}void build(int m){int tot,t,i,x; ED=0;vis[1]=a[1]=1; for(tot=++m,i=2;i<=m;i++)a[i]=read(),mark[a[i]]=vis[a[i]]=1;sort(a+1,a+m+1,cmp);for(i=1;i<m;i++)if(!vis[x=lca(a[i],a[i+1])])vis[a[++tot]=x]=1;m=tot,sort(a+1,a+m+1,cmp);for(q[t=1]=1,i=2;i<=m;q[++t]=a[i++]){while(st[a[i]]<st[q[t]]||en[a[i]]>en[q[t]])t--;ADD_edge(q[t],a[i]);}DP(1);for(i=1;i<=m;i++)mark[a[i]]=vis[a[i]]=0;}
}
using namespace Virtual_Tree;
int n,m,k;
int main(){scanf("%d",&n);Initialize();for(int i=1;i<n;i++){int u,v,w;u=read();v=read();w=read();add_edge(u,v,w); add_edge(v,u,w);}dfs(1); dfs2(1,1);scanf("%d",&m);while(m--){scanf("%d",&k);build(k);printf("%lld\n",dp[1]);}return 0;
}
转载于:https://www.cnblogs.com/forever97/p/bzoj2286.html
BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)相关推荐
- P2495 [SDOI2011]消耗战-虚树+树形dp
https://www.luogu.com.cn/problem/P2495 虚树:当我们在解决树形dp的问题的时候,题目中会给出一些询问,询问涉及的关键节点不多,并保证总的点数规模的时候,我们就可以 ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问, 每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接. 最少的边权和是多少. (n<=250000,sigma(ki)&l ...
- BZOJ 3611 [Heoi2014]:虚树+树形DP
时空隧道 今天考试T3正解是虚树-..(看到这个名字我好虚啊-.) 现在我们需要处理一棵树上k个点的询问,做一遍树形DP-- 复杂度是O(n)的,q个询问,感觉复杂度很爆炸-..>_<-- ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- bzoj 3611: [Heoi2014]大工程(虚树+树形DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MB Submit: 1697 Solved: 718 [Submit][Stat ...
- 「Luogu2495」 [SDOI2011]消耗战 虚树
Luogu P2495 [SDOI2011]消耗战 problem Solution 苦思冥想稍作思考之后可以得到一个树形DP的方法: 令\(w(u,v)\)表示u,v之间的边的权值,\(f[u]\) ...
- 洛谷_2495 [SDOI2011]消耗战(虚树)
消耗战 题目链接:https://www.luogu.com.cn/problem/P2495 题解: 对于单样例,可以考虑树形DP. 但此题是多实例,所以需要对树进行处理,每次询问有k+1(加上一号 ...
- BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP
题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...
- 洛谷 P2495 [SDOI2011]消耗战 虚树
题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...
最新文章
- SpringMVC怎么获取前台传来的数组
- 专属个人的聊天机器人的实现——图灵机器人
- 【CV】基于OpenCV的手掌检测和手指计数
- 利用属性block进行代替代理使得两个viewController传参
- python如何统计累计每日的人数‘’_Python数据分析2019陕西高考(理工)成绩及填报志愿...
- 紧追SpaceX,又一星际飞船明年4月要首次载人飞行
- 贪心法——LeetCode 55 跳跃游戏
- JS1 js获取dom元素方法
- CentOS搭建git服务器实测
- CocosCreator之KUOKUO带你简单使用Spine骨骼动画
- 有限差分法与有限单元法的区别
- html整体结构,详解HTML的整体结构
- lesson 4 introductions
- python编程火车票_100行Python代码自动抢火车票!
- 前端静态服务踩坑实践
- HTML文字阴影火焰,CSS3文字特效属性text-shadow的介绍,实例讲解火焰文字效果
- C++ STL之命名空间、函数模板、类模板
- 批量删除 Word 文档中的所有图片
- Windows CreateFont:创建自己的字体
- swagger升级knife4j:一路上升级打怪
热门文章
- 编译doubango时,ffmpeg先用 2.8.15,再用4.2.2
- 同样一句代码,在类内调用,跟类外调用结果不同?
- 初步猜测,当map所在线程跟显存有关时,容易崩溃
- 百度地图与高德地图比较
- 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...
- win10计算机本地无法连接,Win10没有本地连接怎么办?
- linux 系列:[所有相关文章链接]
- c读取txt文件内容并建立一个链表_面试官给我挖坑:rm删除文件之后,空间就被释放了吗?...
- oracle集群启动状态,oracle 11g集群软件无法启动解决步骤
- 自定义 线性布局_智能组件探索:这个工具栏会自动布局~