码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 虚树 (模板)


    [SDOI2011] 消耗战 - 洛谷

    虚树,就是用来在图上dp时,避免无用的点太多影响时间的一种优化方式,它新建了一张图,从而减少无关点的遍历,在稀疏图上时能大大优化时间。

    具体做法就是,把所有关键点按dfs序排序,然后一条链一条链地遍历,其中会出现4中情况,参考大佬博客:题解 P2495 【[SDOI2011]消耗战】 - Rhodoks 的博客 - 洛谷博客 

    我们按照栈来遍历就正好符合由一条链跳到另一条链的过程,叶节点先出栈,根节点不变,再入新的链,按照不同情况连点,目的是保证这些关键点互相连接。

    参考代码:

    1. /*keep on going and never give up*/
    2. #include<bits/stdc++.h>
    3. using namespace std;
    4. #define int long long
    5. #define ll long long
    6. #define endl "\n"
    7. #define fast std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    8. const double E = exp(1);
    9. const double PI = acos(-1.0);
    10. const int mod=1e9+7;
    11. const int maxn=250010;
    12. struct node{
    13. int to,nxt,w;
    14. }e[maxn<<1];int tot,head[maxn];
    15. void add(int x,int y,int z){ e[++tot]={y,head[x],z};head[x]=tot;}
    16. int dep[maxn],fa[maxn],siz[maxn],son[maxn],top[maxn],mi[maxn];
    17. void dfs1(int x,int f){
    18. dep[x]=dep[f]+1;
    19. fa[x]=f;
    20. siz[x]=1;
    21. int mson=-1;
    22. for(int i=head[x];i;i=e[i].nxt){
    23. int v=e[i].to;
    24. if(f==v) continue;
    25. mi[v]=min(mi[x],e[i].w);
    26. dfs1(v,x);
    27. siz[x]+=siz[v];
    28. if(siz[v]>mson) son[x]=v,mson=siz[v];
    29. }
    30. }
    31. int dfn[maxn],id;
    32. void dfs2(int x,int t){
    33. top[x]=t;
    34. dfn[x]=++id;
    35. if(!son[x]) return ;
    36. dfs2(son[x],t);
    37. for(int i=head[x];i;i=e[i].nxt){
    38. int v=e[i].to;
    39. if(v==fa[x]||v==son[x]) continue;
    40. dfs2(v,v);
    41. }
    42. }
    43. int lca(int x,int y){
    44. while(top[x]!=top[y])dep[top[x]]>dep[top[y]]?x=fa[top[x]]:y=fa[top[y]];
    45. return dep[x]<dep[y]?x:y;
    46. }
    47. int n,m,k,a[maxn],s[maxn],h;
    48. vector<int>g[maxn];
    49. void add_g(int x,int y){g[x].push_back(y);}
    50. void _insert(int x){
    51. if(h==1){ s[++h]=x;return;}
    52. int tep=lca(x,s[h]);
    53. if(tep==s[h])return ;//情况1
    54. while(h>1&&dfn[s[h-1]]>=dfn[tep])add_g(s[h-1],s[h]),h--;// 情况4化为2,3
    55. if(tep!=s[h])add_g(tep,s[h]),s[h]=tep;//情况2,3
    56. s[++h]=x;// 虚树建树
    57. }
    58. bool cmp(int x,int y){return dfn[x]<dfn[y];}
    59. int dp(int x,int fa){
    60. if(g[x].size()==0) return mi[x];
    61. int sum=0;
    62. for(auto y:g[x]) sum+=dp(y,x);
    63. g[x].clear();
    64. return min(sum,mi[x]);
    65. }
    66. signed main(){
    67. fast
    68. cin>>n;
    69. mi[1]=1e17;
    70. for(int i=1;i<n;i++){
    71. int x,y,z;
    72. cin>>x>>y>>z;
    73. add(x,y,z);add(y,x,z);
    74. }
    75. dfs1(1,0);dfs2(1,1);
    76. cin>>m;
    77. for(int i=1;i<=m;i++){
    78. int k;cin>>k;
    79. for(int j=1;j<=k;j++) cin>>a[j];
    80. sort(a+1,a+1+k,cmp);
    81. h=1;s[h]=1;
    82. for(int j=1;j<=k;j++)_insert(a[j]);
    83. while(h>0) add_g(s[h-1],s[h]),h--;
    84. cout<<dp(1,0)<<endl;
    85. }
    86. }

     

  • 相关阅读:
    数据结构与算法(C++实现) 课堂笔记「全英」
    【计算机考研408-计算机网络-奈氏准则】什么时候是理想低通信道、什么时候是理想带通信道?
    超声检测技术(一)
    【Java】环境配置以及快速切换环境的技巧和方法
    随笔感悟:Mysql悲观锁和乐观锁
    MySQL数据库之主从复制及读写分离
    视频增强修复工具Topaz Video AI mac中文版安装教程
    Bootstrap的宽度和高度的设置(相对于父元素的宽度和高度、相对于视口的宽度和高度)
    JUC学习
    【HTML】前端网页开发工具Vscode中DOCTYPE和lang以及字符集的作用
  • 原文地址:https://blog.csdn.net/qq_62539009/article/details/125469467
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号