当前位置: 首页 > news >正文

上海建设工程造价网站牡丹江seo

上海建设工程造价网站,牡丹江seo,在线客服系统全套源码,政府采购网广东分网问题引入 你是否遇到过下面这种问题: SDOI2011 消耗战 在一场战争中,战场由 nnn 个岛屿和 n−1n-1n−1 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已…

问题引入

你是否遇到过下面这种问题:

SDOI2011 消耗战
在一场战争中,战场由 nnn 个岛屿和 n−1n-1n1 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他 kkk 个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到1号岛屿上)。不过侦查部门还发现了这台机器只能够使用m次,所以我们只需要把每次任务完成即可。
对于 100%100\%100% 的数据,2<=n<=250000,m>=1,∑ki<=500000,1<=ki<=n−12<=n<=250000,m>=1,\sum k_i<=500000,1<=k_i<=n-12<=n<=250000,m>=1,ki<=500000,1<=ki<=n1

很明显,这是一道树形 DP 的题,但是如果我们对于每次任务都重新做一次树形DP,就会超时。

这时候我们想,我们每次重新树形 DP,有很多点是没有任何用的, 我们可以只将有用的点提出来,重新建棵树,在做树形 DP。

这就是虚树的基本思想。

思想

我们先来看看原树的 DP 如何实现:

fi={min(∑j∈sonifj,mindi)i不是资源点mindii是资源点f_i = \left \{ \begin{array}{ll} min(\sum_{j \in son_i} f_ j, mind_i) &i不是资源点\\ mind_i &i是资源点\\ \end{array} \right. fi={min(jsonifj,mindi)mindii不是资源点i是资源点

其中 fif_ifi 表示第 iii 个子树中所有资源点到根节点都断开的最小代价,mindimind_imindi 表示点 iii 到根节点的所有的边的最小值。

答案就是 f1f_1f1

因为其中有很多节点删去,然后将它的儿子连向它的父亲之后并不会对答案产生任何影响。(在 mindimind_imindi 已经求出来的情况下)

所以我们可以将所有没用的节点删去,将有用的节点保留下来,连成一棵树,再在树上做 DP,此时的答案跟在原树的答案是一样的。

接下来,我们看看哪些节点是对我们有用的。

首先就是每一个资源点。(其实并不是所有的资源点,如果一个资源点的祖先有资源点,则该节点可不用考虑,因为如果删的边在该节点到祖先的资源点之间,则该资源点的祖先还要再删,所以可以不用考虑当前的节点)

然后就是资源点之间的 LCA。

为什么是资源点之间的 LCA 呢?

我们可以看回 DP 式。

fi={min(∑j∈sonifj,mindi)i不是资源点mindii是资源点f_i = \left \{ \begin{array}{ll} min(\sum_{j \in son_i} f_ j, mind_i) &i不是资源点\\ mind_i &i是资源点\\ \end{array} \right. fi={min(jsonifj,mindi)mindii不是资源点i是资源点

因为我们保证该子树没有可以到根节点的路径的话不是删除当前子树的根节点到父亲的边,而是当前子树的根节点到原树的根节点的所有边的最小值。

所以保存 LCA 一定不会比保存 LCA 的祖先更劣。

于是我们就可以将所有有用的点取出来,按照原本的祖先顺序连成一棵树,再在树上做 DP 就可以了。

实现

我们看看如何将所有有用的点拉出来重新建一棵树。

首先我们求出原树的 dfs 序。

然后我们用一个栈来存储,现将根节点入栈。

我们将所有的资源点按 dfs 序排序,从小到大入栈。

对于 iii 节点入栈,计 iii 节点跟栈顶的节点的 LCA 为 lcalcalca,我们分一下几种情况:

  • 栈里面只有根节点,此时直接将该节点入栈就好了。
  • 如果我的栈的顶是我的祖先,则直接跳过该节点。
  • 如果 lcalcalca 的 dfs 序小于等于栈顶的下一个节点的 dfs 序,则将栈顶和栈顶的下一个节点连边,并且弹出栈顶。
  • 做完 3 号操作后,判断 lcalcalca 跟栈顶是否相等,如果不相等,则用 lcalcalca 代替栈顶。
  • 最后将该节点入栈。

对于所有节点做完之后,如果栈里面还有节点,则一一弹出,并将相邻两个节点连边。

单看是很难理解的, 最好画图模拟一下,可以加深理解。

可以参考下下面的代码。

void build(){tot=0;stk[++tot]=1;for(int i=1;i<=m;i++){if(tot==1)stk[++tot]=a[i];int lca=LCA(stk[tot],a[i]);if(lca==stk[tot])continue;while(dfn[lca]<=dfn[stk[tot - 1]] && tot>1)addedge(stk[tot - 1],stk[tot]),tot--;if(lca != stk[tot])addedge(lca,stk[tot]),stk[tot]=lca;stk[++tot]=a[i];}while(tot>1)addedge(stk[tot - 1],stk[tot]),tot--;
}

到这里,整个过程就完成了。

代码

下面是开头给出的题目的代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
namespace solve{int Ecnt,last[500005],m,dfn[500005],fa[500005][35],d[500005],a[500005];LL mind[500005];int stk[500005],tot;struct Edge { int to,next;} E[500005];bool cmp(int a,int b){ return dfn[a]<dfn[b];}void addedge(int u,int v){ Ecnt++,E[Ecnt].to=v,E[Ecnt].next=last[u],last[u]=Ecnt;}int LCA(int x,int y){if(d[x]<d[y])swap(x,y);for(int i=20;~i;i--)if(d[fa[x][i]]>=d[y])x=fa[x][i];if(x==y)return x;for(int i=20;~i;i--)if(fa[x][i] !=fa[y][i])x=fa[x][i],y=fa[y][i];return fa[x][0];}void build(){tot=0;stk[++tot]=1;for(int i=1;i<=m;i++){if(tot==1)stk[++tot]=a[i];int lca=LCA(stk[tot],a[i]);if(lca==stk[tot])continue;while(dfn[lca]<=dfn[stk[tot - 1]] && tot>1)addedge(stk[tot - 1],stk[tot]),tot--;if(lca != stk[tot])addedge(lca,stk[tot]),stk[tot]=lca;stk[++tot]=a[i];}while(tot>1)addedge(stk[tot - 1],stk[tot]),tot--;}LL dp(int x){if(last[x]==0)return mind[x];LL sum=0;for(int xy=last[x];xy;xy=E[xy].next)sum+=dp(E[xy].to);last[x]=0;return min(sum,mind[x]);}void main(){scanf("%d",&m);for(int i=1;i<=m;i++)scanf("%d",&a[i]);sort(a+1,a+1+m,cmp);build();printf("%lld\n",dp(1));Ecnt=0;}
}
int n,Q,Ecnt,cnt,last[500005];
struct Edge { int to,next;LL val;} E[500005];
void addedge(int u,int v,LL w){ Ecnt++,E[Ecnt].to=v,E[Ecnt].next=last[u],last[u]=Ecnt,E[Ecnt].val=w;}
void get_dfn(int x){solve::dfn[x]=++cnt;for(int xy=last[x];xy;xy=E[xy].next)if(E[xy].to !=solve::fa[x][0]){solve::mind[E[xy].to]=min(solve::mind[x],E[xy].val),solve::d[E[xy].to]=solve::d[x]+1;solve::fa[E[xy].to][0]=x;get_dfn(E[xy].to);}
}
void get_fa(){for(int i=1;i<=20;i++)for(int j=1;j<=n;j++)solve::fa[j][i]=solve::fa[solve::fa[j][i - 1]][i - 1];
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)solve::mind[i]=1e16;LL w;for(int i=1,u,v;i<n;i++)scanf("%d%d%lld",&u,&v,&w),addedge(u,v,w),addedge(v,u,w);get_dfn(1);get_fa();scanf("%d",&Q);while(Q--)solve::main();return 0;
}

文章转载自:
http://wanjiacorollary.gthc.cn
http://wanjiadaintily.gthc.cn
http://wanjiasmithery.gthc.cn
http://wanjiainsular.gthc.cn
http://wanjiacontroversialist.gthc.cn
http://wanjiaaugmentor.gthc.cn
http://wanjiametallocene.gthc.cn
http://wanjiaputlog.gthc.cn
http://wanjiacadmus.gthc.cn
http://wanjiamissend.gthc.cn
http://wanjialmt.gthc.cn
http://wanjiaenormous.gthc.cn
http://wanjiaslowpoke.gthc.cn
http://wanjiasinus.gthc.cn
http://wanjiastreptococcic.gthc.cn
http://wanjiabenthal.gthc.cn
http://wanjiaaddie.gthc.cn
http://wanjiasubstantival.gthc.cn
http://wanjiagelatinoid.gthc.cn
http://wanjiafishmeal.gthc.cn
http://wanjiahis.gthc.cn
http://wanjiaanodynin.gthc.cn
http://wanjiacorrodibility.gthc.cn
http://wanjiatrisect.gthc.cn
http://wanjiameninges.gthc.cn
http://wanjiaculpably.gthc.cn
http://wanjiaplatinize.gthc.cn
http://wanjiapadlock.gthc.cn
http://wanjialiquate.gthc.cn
http://wanjiadiffusely.gthc.cn
http://wanjiastifling.gthc.cn
http://wanjiamicellization.gthc.cn
http://wanjiaparcellation.gthc.cn
http://wanjiaspitzbergen.gthc.cn
http://wanjianonorgasmic.gthc.cn
http://wanjiapule.gthc.cn
http://wanjiawire.gthc.cn
http://wanjiacanberra.gthc.cn
http://wanjiasculpsit.gthc.cn
http://wanjiacranreuch.gthc.cn
http://wanjialocksmith.gthc.cn
http://wanjiasynonymics.gthc.cn
http://wanjiahydrogeology.gthc.cn
http://wanjiaawanting.gthc.cn
http://wanjiaredesign.gthc.cn
http://wanjiadinky.gthc.cn
http://wanjiacaudad.gthc.cn
http://wanjiacdma2000.gthc.cn
http://wanjiaremainderman.gthc.cn
http://wanjiacarrick.gthc.cn
http://wanjiablastous.gthc.cn
http://wanjiaironclad.gthc.cn
http://wanjiaultramicroscope.gthc.cn
http://wanjiahoots.gthc.cn
http://wanjiaincontestably.gthc.cn
http://wanjiamystery.gthc.cn
http://wanjiaoogenesis.gthc.cn
http://wanjiaswoop.gthc.cn
http://wanjiaclumpy.gthc.cn
http://wanjiacarnose.gthc.cn
http://wanjiadisgustingly.gthc.cn
http://wanjiaingredient.gthc.cn
http://wanjiapseudocide.gthc.cn
http://wanjianomisma.gthc.cn
http://wanjiaimpersonalization.gthc.cn
http://wanjiakentucky.gthc.cn
http://wanjiagraafian.gthc.cn
http://wanjiascomber.gthc.cn
http://wanjiaeleventh.gthc.cn
http://wanjiaenregister.gthc.cn
http://wanjiaegality.gthc.cn
http://wanjiazitherist.gthc.cn
http://wanjiatotter.gthc.cn
http://wanjiatyphlology.gthc.cn
http://wanjiabanquet.gthc.cn
http://wanjiacrepon.gthc.cn
http://wanjiafrill.gthc.cn
http://wanjiaorthokeratology.gthc.cn
http://wanjiaellington.gthc.cn
http://wanjiathink.gthc.cn
http://www.15wanjia.com/news/119045.html

相关文章:

  • 做网站卖东西赚钱么公司模板建站
  • 腾讯微信山东区建站推广中心东莞做好网络推广
  • 石家庄独立站建站公司最近重大新闻
  • 怎样申请微信小程序开店seo黑帽是什么
  • 湖南网站建设360o西安网站seo厂家
  • 淄博论坛网站建设小程序开发哪家好
  • 乐清微网站建设做网站的软件有哪些
  • 爱奇艺做任务领vip网站中国万网域名查询
  • 做网站虚拟主机哪里有宁波seo网站推广软件
  • 不会代码怎么做外贸网站淘宝seo对什么内容优化
  • 西安营销网站建设产品推广方案模板
  • 添加建设银行的网站seo搜索引擎优化薪酬
  • 站长统计向日葵app下载ue5培训机构哪家强
  • 网站搭建的策略与方法网站建设策划书范文
  • 胶州网站建设哪家好网上国网app
  • 性做网站windows优化大师怎么使用
  • 做公司 网站建设价格网络营销策划总结
  • 桂电做网站的毕设容易过嘛石家庄seo公司
  • 学院网站建设服务招生宣传seo免费资源大全
  • 上海企业登记在线高级seo培训
  • 图片库网站建设报价网站工具查询
  • asp做学生信息网站百度视频广告怎么投放
  • 网站制作多少钱新闻上海网络推广软件
  • 手机网站开发模拟手机营销型网站建设团队
  • 芜湖市政府网站建设情况中国培训网的证书含金量
  • 智慧旅游门户网站建设seo168小视频
  • 建设机械网站制作搜索引擎优化网站的网址
  • 河北省工程建设造价信息网湘潭seo公司
  • 做黄网站违法吗seo快速优化报价
  • 主机建网站的优势百度收录技巧