bzoj 3611: [Heoi2014]大工程

虚树与树形DP详解
本文详细介绍了虚树的概念及树形动态规划的应用,并通过具体实现代码展示了如何利用虚树进行路径查询优化,适用于解决特定类型的组合优化问题。
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #define M 2000009
  6 #define inf 0x7ffffff
  7 #define ll long long
  8 using namespace std;
  9 int n,head[M],next[M],u[M],cnt,head1[M],next1[M],u1[M],fa[M][21],deep[M],m,dfn[M],T,v[M];
 10 int h[M],st[M],mn[M],mx[M],size[M],mx1,mi1,v1[M];
 11 ll cn1,sum[M];
 12 void jia(int a1,int a2)
 13 {
 14     cnt++;
 15     next[cnt]=head[a1];
 16     head[a1]=cnt;
 17     u[cnt]=a2;
 18     return;
 19 }
 20 void jia2(int a1,int a2)
 21 {
 22     if(a1==a2)
 23       return;
 24     cnt++;
 25     next1[cnt]=head1[a1];
 26     head1[a1]=cnt;
 27     u1[cnt]=a2;
 28     v1[cnt]=deep[a2]-deep[a1];
 29     return;
 30 }
 31 bool cmp(int a1,int a2)
 32 {
 33     return dfn[a1]<dfn[a2];
 34 }
 35 void dfs(int a1)
 36 {
 37     dfn[a1]=++T;
 38     for(int i=1;(1<<i)<=deep[a1];i++)
 39       fa[a1][i]=fa[fa[a1][i-1]][i-1];
 40     for(int i=head[a1];i;i=next[i])
 41       if(fa[a1][0]!=u[i])
 42         {
 43             deep[u[i]]=deep[a1]+1;
 44             fa[u[i]][0]=a1;
 45             dfs(u[i]);
 46         }
 47     return;
 48 }
 49 int lca(int a1,int a2)
 50 {
 51     if(deep[a1]<deep[a2])
 52       swap(a1,a2);
 53     int a3=deep[a1]-deep[a2];
 54     for(int i=0;i<=20;i++)
 55       if(a3&(1<<i))
 56         a1=fa[a1][i];
 57     for(int i=20;i>=0;i--)
 58       if(fa[a1][i]!=fa[a2][i])
 59         {
 60             a1=fa[a1][i];
 61             a2=fa[a2][i];
 62         }
 63     if(a1==a2)
 64       return a1;
 65     return fa[a1][0];
 66 }
 67 void dp(int x){
 68     sum[x]=0;
 69     mx[x]=v[x]?0:-inf;
 70     mn[x]=v[x]?0:inf;
 71     size[x]=v[x];
 72     for(int i=head1[x];i;i=next1[i]){
 73         int v=u1[i];
 74         dp(v);
 75         cn1+=(sum[x]+size[x]*v1[i])*size[v]+size[x]*sum[v];
 76         size[x]+=size[v];
 77         sum[x]+=sum[v]+(ll)size[v]*v1[i];
 78         mi1=min(mi1,mn[v]+mn[x]+v1[i]);
 79         mx1=max(mx1,mx[v]+mx[x]+v1[i]);
 80         mn[x]=min(mn[x],mn[v]+v1[i]);
 81         mx[x]=max(mx[x],mx[v]+v1[i]);
 82     }
 83     head1[x]=0;
 84 }
 85 void solve(){
 86     cnt=cn1=0;mi1=inf;mx1=-inf;
 87     int K;
 88     scanf("%d",&K);
 89     for(int i=1;i<=K;i++) scanf("%d",&h[i]),v[h[i]]=1;
 90     sort(h+1,h+K+1,cmp);int top=1;st[1]=1;
 91     for(int i=1;i<=K;i++){
 92         int now=h[i],f=lca(st[top],now);
 93         if(dfn[f]==dfn[st[top]]) st[++top]=now;
 94         else{
 95             while(top){
 96                 int q=st[top-1];
 97                 if(dfn[q]>dfn[f]) jia2(st[top-1],st[top]),top--;
 98                 else if(dfn[q]==dfn[f]){
 99                     jia2(q,st[top]);top--;break;
100                 }
101                 else {
102                     jia2(f,st[top]);st[top]=f;break;
103                 }   
104             }
105             if(st[top]!=now) st[++top]=now;
106         }
107     }
108     while(--top)jia2(st[top],st[top+1]);
109     dp(1);
110     printf("%lld ",cn1);
111     printf("%d %d\n",mi1,mx1);
112     for(int i=1;i<=K;i++) v[h[i]]=0;
113 }
114 int main()
115 {
116     scanf("%d",&n);
117     for(int i=1;i<n;i++)
118       {
119         int a1,a2;
120         scanf("%d%d",&a1,&a2);
121         jia(a1,a2);
122         jia(a2,a1);
123       }
124     dfs(1);
125     scanf("%d",&m);
126     for(int i=1;i<=m;i++)
127       solve();
128     return 0;
129 }

虚树,树形DP

转载于:https://www.cnblogs.com/xydddd/p/5309513.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值