P2495 [SDOI2011]消耗战

题目链接

题解:
虚树\(dp\)入门题吧。虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是一样的,所以可以就求出dfs序并且利用它来构造。最后的图中只有关键点以及某些关键点对的lca。
具体构造方法就是利用一个栈,假设当前插入结点为\(x\),求出栈顶元素和\(x\)的lca,如果栈顶元素为lca,那么我们就继续延长这条链;否则(此时栈顶元素和\(x\)在lca的两颗子树上面)就将栈顶元素到\(lca\)上面的点弹出来并且建边,然后继续延长\(x\)这边的链。
感觉说得不是很清楚,详见代码吧:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 250005 ;
int n, m;
struct Edge{int v, next, w;
}e[N << 1];
int head[N], tot;
void adde(int u, int v, int w) {e[tot].v = v; e[tot].w = w; e[tot].next = head[u]; head[u] = tot++;
}
vector <int> g[N] ;
int f[N][20], deep[N], dfn[N];
ll mn[N];
int T;
void dfs(int u, int fa) {deep[u] = deep[fa] + 1;dfn[u] = ++T;for(int i = head[u]; i != -1; i = e[i].next) {int v = e[i].v;if(v == fa) continue ;mn[v] = min((ll)e[i].w, mn[u]) ;f[v][0] = u;for(int j = 1; j <= 17; j++) f[v][j] = f[f[v][j - 1]][j - 1] ;dfs(v, u) ;}
}
int LCA(int x, int y) {if(deep[x] < deep[y]) swap(x, y) ;for(int i = 17; i >= 0; i--) {if(deep[f[x][i]] >= deep[y]) x = f[x][i] ;}if(x == y) return x;for(int i = 17; i >= 0; i--) {if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i] ;}return f[x][0] ;
}
int sta[N], a[N];
int top;
bool cmp(const int &x, const int &y) {return dfn[x] < dfn[y] ;
}
void add_edge(int u, int v) {g[u].push_back(v) ;
}
void insert(int x) {int lca = LCA(x, sta[top]) ;if(top == 1) {sta[++top] = x; return ;}if(lca == sta[top]) return ;while(top > 1 && dfn[sta[top - 1]] >= dfn[lca]) {add_edge(sta[top - 1], sta[top]); top--;}if(sta[top] != lca) add_edge(lca, sta[top]), sta[top] = lca;sta[++top] = x;
}
ll DP(int u) {if(g[u].size() == 0) return mn[u];ll sum = 0;for(auto v : g[u]) sum += DP(v) ;g[u].clear() ;return min(sum, (ll)mn[u]) ;
}
int main() {ios::sync_with_stdio(false); cin.tie(0);cin >> n;mn[1] = 1ll << 56;memset(head, -1, sizeof(head)) ;for(int i = 1; i < n; i++) {int u, v, w;cin >> u >> v >> w;adde(u, v, w); adde(v, u, w) ;}dfs(1, 0) ;cin >> m;while(m--) {int k; cin >> k;for(int i = 1; i <= k; i++) cin >> a[i] ;sort(a + 1, a + k + 1, cmp) ;sta[top = 1] = 1;for(int i = 1; i <= k; i++) insert(a[i]) ;while(top > 1) add_edge(sta[top - 1], sta[top]), top--;cout << DP(1) << '\n' ;}return 0 ;
}

转载于:https://www.cnblogs.com/heyuhhh/p/10902915.html

洛谷P2495 [SDOI2011]消耗战(虚树dp)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 洛谷 P2495 [SDOI2011]消耗战

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

  8. P2495 [SDOI2011]消耗战(树形dp+虚树)

    P2495 [SDOI2011]消耗战 树形dp 状态表示:fuf_ufu​表示以uuu为根的子树中,uuu节点与子树中的关键的"隔开"所需要的最小代价 状态转移: 考虑uuu的一 ...

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

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

最新文章

  1. c语言 文件名变量,C语言中,如何用根据不同的变量来更改文件名?
  2. springboot2新版springcloud微服务,带你了解不一样的springboot2
  3. ARM Cortex-M0微控制器汇编语言之分支条件的典型用法
  4. 大牛书单 | 数据库专题好书分享
  5. python 中的yum pip
  6. Linux下TCP/IP优化
  7. 三星计划在第二代GalaxyFold上采用屏下摄像头技术
  8. c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?
  9. 对代码更有信心--单元测试工具Mockito简单介绍
  10. ArrayList的retainAll()方法使用
  11. 不知道PDF文件怎么解密?推荐3个实用方法给你
  12. 北京交通大学计算机学院复试名单2021,北京交通大学2021年硕士研究生复试公告...
  13. 讲台计算机的英语怎么读,讲台的英语单词怎么写,英语怎么拼写!
  14. 区块链技术再出新玩法——解决跨境支付问题
  15. 一个软件工程师的7年工作经验总结
  16. 烤仔看世界 | 百度、谷歌、微软等巨头争相入局,一场改变AI格局的隐秘拍卖……...
  17. 数据泄露是如何发生的?有哪些预防措施...
  18. 群晖docker火狐_群晖 Docker百度云下载文件方法2019
  19. 前端学习之HTML——表格
  20. 个人开公司的流程,以后用得着

热门文章

  1. 终于,数据中台成为3000万企业的增长引擎
  2. 通过label标记实现单选框点击文字也能选中
  3. android 录音的格式转换,Android仿微信录音功能(录音后的raw文件转mp3文件)
  4. dell服务器 指示灯_DELL服务器面板指示灯错误代码
  5. Web3 时代 市场营销的变迁
  6. 安卓微信名字彩色字体怎么设置? 微信名字特效设置教程
  7. 1、swift开发iOS——基础
  8. Excel选中区域全都除以某一个数
  9. python预测股票 keras_keras实现股票预测
  10. Oracle EBS Concurrent Request:Gather Schema Statistics