【题目链接】 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)相关推荐

  1. P2495 [SDOI2011]消耗战-虚树+树形dp

    https://www.luogu.com.cn/problem/P2495 虚树:当我们在解决树形dp的问题的时候,题目中会给出一些询问,询问涉及的关键节点不多,并保证总的点数规模的时候,我们就可以 ...

  2. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问, 每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接. 最少的边权和是多少. (n<=250000,sigma(ki)&l ...

  3. BZOJ 3611 [Heoi2014]:虚树+树形DP

    时空隧道 今天考试T3正解是虚树-..(看到这个名字我好虚啊-.) 现在我们需要处理一棵树上k个点的询问,做一遍树形DP-- 复杂度是O(n)的,q个询问,感觉复杂度很爆炸-..>_<-- ...

  4. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...

  5. BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP

    题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...

  6. bzoj 3611: [Heoi2014]大工程(虚树+树形DP)

    3611: [Heoi2014]大工程 Time Limit: 60 Sec  Memory Limit: 512 MB Submit: 1697  Solved: 718 [Submit][Stat ...

  7. 「Luogu2495」 [SDOI2011]消耗战 虚树

    Luogu P2495 [SDOI2011]消耗战 problem Solution 苦思冥想稍作思考之后可以得到一个树形DP的方法: 令\(w(u,v)\)表示u,v之间的边的权值,\(f[u]\) ...

  8. 洛谷_2495 [SDOI2011]消耗战(虚树)

    消耗战 题目链接:https://www.luogu.com.cn/problem/P2495 题解: 对于单样例,可以考虑树形DP. 但此题是多实例,所以需要对树进行处理,每次询问有k+1(加上一号 ...

  9. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  10. 洛谷 P2495 [SDOI2011]消耗战 虚树

    题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...

最新文章

  1. SpringMVC怎么获取前台传来的数组
  2. 专属个人的聊天机器人的实现——图灵机器人
  3. 【CV】基于OpenCV的手掌检测和手指计数
  4. 利用属性block进行代替代理使得两个viewController传参
  5. python如何统计累计每日的人数‘’_Python数据分析2019陕西高考(理工)成绩及填报志愿...
  6. 紧追SpaceX,又一星际飞船明年4月要首次载人飞行
  7. 贪心法——LeetCode 55 跳跃游戏
  8. JS1 js获取dom元素方法
  9. CentOS搭建git服务器实测
  10. CocosCreator之KUOKUO带你简单使用Spine骨骼动画
  11. 有限差分法与有限单元法的区别
  12. html整体结构,详解HTML的整体结构
  13. lesson 4 introductions
  14. python编程火车票_100行Python代码自动抢火车票!
  15. 前端静态服务踩坑实践
  16. HTML文字阴影火焰,CSS3文字特效属性text-shadow的介绍,实例讲解火焰文字效果
  17. C++ STL之命名空间、函数模板、类模板
  18. 批量删除 Word 文档中的所有图片
  19. Windows CreateFont:创建自己的字体
  20. swagger升级knife4j:一路上升级打怪

热门文章

  1. 编译doubango时,ffmpeg先用 2.8.15,再用4.2.2
  2. 同样一句代码,在类内调用,跟类外调用结果不同?
  3. 初步猜测,当map所在线程跟显存有关时,容易崩溃
  4. 百度地图与高德地图比较
  5. 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...
  6. win10计算机本地无法连接,Win10没有本地连接怎么办?
  7. linux 系列:[所有相关文章链接]
  8. c读取txt文件内容并建立一个链表_面试官给我挖坑:rm删除文件之后,空间就被释放了吗?...
  9. oracle集群启动状态,oracle 11g集群软件无法启动解决步骤
  10. 自定义 线性布局_智能组件探索:这个工具栏会自动布局~