题目链接
题意

给你个以 111 为根节点的树,树有边权 www (割断此边),多组询问每次询问给你 mmm 个点,求割断边最小花费使得 111 到这些点都不连通。

思路

询问如果组数少可以直接 O(n)O(n)O(n) 树形dp解决,这题询问很多,但是询问的点集不超过 500000500000500000
对于答案来说很多点是没有贡献的,有贡献的点只有所求点 和 所求点之间的 LCALCALCA,重新对这些点建树即虚树。
每个节点的权值为1到节点上最小边权

本代码建树通过 dfsdfsdfs 序,分情况建,题解区有详细的建树过程。
这里记个代码,这里用树剖求LCA。

代码
#include <bits/stdc++.h>
using namespace std;#define ll long longnamespace shupou {const ll N = 250005;
const ll M = 250005<<1;ll first[N], tot;
struct Node {ll v, w, nxt;
}e[M];
ll deep[N], f[N], sz[N], son[N];
ll cnt, dfn[N], top[N], w[N];void init() {memset(first,-1,sizeof(first));w[1] = 1e18;tot = 0;cnt = 0;deep[0] = 0;
}void add(ll u, ll v, ll w) {e[tot].v = v;e[tot].w = w;e[tot].nxt = first[u];first[u] = tot++;
}void dfs1(ll u, ll fa) {deep[u] = deep[fa]+1;f[u] = fa;sz[u] = 1;son[u] = 0;ll maxson = -1;for(ll i = first[u]; ~i; i = e[i].nxt) {ll v = e[i].v;if(v == fa) continue;w[v] = min(w[u], e[i].w);dfs1(v,u);sz[u] += sz[v];if(sz[v] > maxson) son[u] = v, maxson = sz[v];}
}void dfs2(ll u, ll topfa) {dfn[u] = ++cnt;top[u] = topfa;if(!son[u]) return;dfs2(son[u],topfa);for(ll i = first[u]; ~i; i = e[i].nxt) {ll v = e[i].v;if(v == son[u] || v == f[u]) continue;dfs2(v,v);}
}ll getlca(ll x, ll y) {while(top[x] != top[y]) {if(deep[top[x]] < deep[top[y]]) swap(x,y);x = f[top[x]];}return deep[x] > deep[y] ? y : x;
}
}const ll N = 250005;
bool cmp(ll a, ll b) {return shupou::dfn[a] < shupou::dfn[b];
}ll vis[N], sta[N], top;
vector<ll> e[N];void push(ll x) {int lc = shupou::getlca(x,sta[top]);if(lc == sta[top]) {sta[++top] = x;return;}while(shupou::deep[lc] <= shupou::deep[sta[top-1]]) e[sta[top-1]].push_back(sta[top]), --top;if(shupou::deep[lc] != shupou::deep[sta[top]]) e[lc].push_back(sta[top]), sta[top] = lc;sta[++top] = x;
}ll mp[N];ll dfs(ll u, ll flag) {ll tmp = (mp[u]&&(!flag)) ? shupou::w[u] : 0;for(auto v : e[u]) tmp += dfs(v,flag|mp[u]);e[u].clear();return flag ? 0 : min(shupou::w[u], tmp);
}int main() {shupou::init();ll n;scanf("%lld",&n);for(ll i = 1; i < n; ++i) {ll u, v, w;scanf("%lld%lld%lld",&u,&v,&w);shupou::add(u,v,w);shupou::add(v,u,w);}shupou::dfs1(1,0);shupou::dfs2(1,1);ll t;scanf("%lld",&t);while(t--) {ll m;scanf("%lld",&m);for(ll i = 1; i <= m; ++i) scanf("%lld",&vis[i]), mp[vis[i]] = 1;sort(vis+1,vis+1+m,cmp);sta[top = 1] = 1; // 根初始进栈for(ll i = 1; i <= m; ++i) push(vis[i]);while(top > 1) e[sta[top - 1]].push_back(sta[top]), --top;printf("%lld\n", dfs(1,0));for(ll i = 1; i <= m; ++i) mp[vis[i]] = 0;}return 0;
}

洛谷 P2495 消耗战(虚树)相关推荐

  1. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

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

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

  3. 洛谷P2495 [SDOI2011]消耗战 | 一个典型的可以搞懂虚树的例题

    题目链接 题目大意: 给出一棵树,之后对这棵树进行q次询问,每次询问一个点集,给出使得这些点集中的点都不能直接或者间接的与1相连,需要删边的最小代价(边的代价在给树的时候给出),,点集不包含1,点集总 ...

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

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

  5. 虚树学习笔记(洛谷2495 消耗战)

    题目链接 因为辣鸡csdn,导致之前快写好的博客没了 QWQ悲伤逆流成河qwqqq 首先虚树,这个东西,我感觉是一种思想,或者是方法,而并不是一个数据结构什么的. 他主要是用来解决:给出一棵树,每次询 ...

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

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

  7. 洛谷 P2495 [SDOI2011]消耗战 题解

    题目链接 题目描述: 给你一个有边权的树,若干次询问,每次询问包含一个不含点111的kkk个点的点集,求点111与这些点都不连通的最小代价(删除一些边,代价是他们的权值和). 解题思路: 首先考虑如果 ...

  8. P2495 [SDOI2011]消耗战 虚树入门

    一棵树,n个点m个操作.每条边有权值,每个操作给你k个点,问断开若干条边后使k个点与根不相连的最小边权和是多少. 有sigmaK<500000 易知一个裸的树dp需要复杂度,m次操作后总复杂度为 ...

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

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

最新文章

  1. dedecms网站文章内容按自定义排序的方法
  2. NLP命名实体识别开源实战教程 | 深度应用
  3. php常用案例,PHP常用数组处理函数总结,附带运行案例
  4. qt 在label上以光标位置进行缩放_缩放|位移|渐变简单动画
  5. JVM内存模型与GC回收器
  6. 蓝桥杯 单点最短路径问题
  7. python函数注解
  8. python实验三答案_20192116 实验三《Python程序设计》实验报告
  9. Python 日期计算:计算某日期前几天,后几天的日期,也可以计算小时,分钟之后的日期时间
  10. LeetCode(8) - String to Integer (atoi)
  11. 2022年6月25日PMP考试通关宝典-2
  12. 巧用代理猎手揪出局域网中的二级代理
  13. 计算机软件免税,软件产品的增值税优惠有哪些?
  14. Redis Cluster集群
  15. Java整合FFmpeg截取视频某一帧为图片
  16. 通信协议之序列化——TLV详解
  17. 计算机硬件未来发展前景,计算机硬件的未来发展趋势
  18. 为什么vs数据库中文显示问号_oracle中文显示为问号
  19. ROC/AUC、精准率、召回率、真正率,假正率等指标含义,学习笔记
  20. 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园

热门文章

  1. 《海盗来了》疯狂游戏,如何用数据抢占小游戏市场
  2. Python循环练习-货币兑换
  3. 第三人称的英语作文我和我的计算机,以第三人称介绍自己的朋友英语作文
  4. 阿里云再投2000亿元背后的无奈和坚持
  5. 青龙面板—-美团买菜
  6. 华硕x45vd安装黑苹果Yosemite 10.10.3记录
  7. 南方科技大学快速建设世界一流超算系统
  8. Android清除WebView缓存
  9. #《JAVA程序设计》 20155214 实验五 网络编程与安全
  10. 电脑开关坏了,用Reset键代替开关机键盘