日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ3677】[Apio2014]连珠线 换根DP

發(fā)布時(shí)間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ3677】[Apio2014]连珠线 换根DP 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【BZOJ3677】[Apio2014]連珠線(xiàn)

Description

在列奧納多·達(dá)·芬奇時(shí)期,有一個(gè)流行的童年游戲,叫做“連珠線(xiàn)”。不出所料,玩這個(gè)游戲只需要珠子和線(xiàn),珠子從1到禮編號(hào),線(xiàn)分為紅色和藍(lán)色。游戲開(kāi)始時(shí),只有1個(gè)珠子,而接下來(lái)新的珠子只能通過(guò)線(xiàn)由以下兩種方式被加入:?
1.Append(w,杪):-個(gè)新的珠子w和一個(gè)已有的珠子杪連接,連接使用紅線(xiàn)。?
2.Insert(w,u,v):-個(gè)新的珠子w加入到一對(duì)通過(guò)紅線(xiàn)連接的珠子(u,杪)之間,并將紅線(xiàn)改成藍(lán)線(xiàn)。也就是將原來(lái)u連到1的紅線(xiàn)變?yōu)閡連到w的藍(lán)線(xiàn)與W連到V的藍(lán)線(xiàn)。?
無(wú)論紅線(xiàn)還是藍(lán)線(xiàn),每條線(xiàn)都有一個(gè)長(zhǎng)度。而在游戲的最后,將得到游戲的最后得分:所有藍(lán)線(xiàn)的長(zhǎng)度總和。?
現(xiàn)在有一個(gè)這個(gè)游戲的最終結(jié)構(gòu):你將獲取到所有珠子之間的連接情況和所有連線(xiàn)的長(zhǎng)度,但是你并不知道每條線(xiàn)的顏色是什么。?
你現(xiàn)在需要找到這個(gè)結(jié)構(gòu)下的最大得分,也就是說(shuō):你需要給每條線(xiàn)一個(gè)顏色f紅色或藍(lán)色),使得這種連線(xiàn)的配色方案是可以通過(guò)上述提到的兩種連線(xiàn)方式操作得到的,并且游戲得分最大。在本題中你只需要輸出最大的得分即可。?

Input

第一行是一個(gè)正整數(shù)n,表示珠子的個(gè)數(shù),珠子編號(hào)為1剄n。?
接下來(lái)n-l行,每行三個(gè)正整數(shù)ai,bi(l≤ai10000),表示有一條長(zhǎng)度為ci的線(xiàn)連接了珠子ai和珠子bi。?

Output

輸出一個(gè)整數(shù),為游戲的最大得分。?

Sample Input

5
1 2 10
1 3 40
1 4 15
1 5 20

Sample Output

60

HINT

數(shù)據(jù)范圍滿(mǎn)足1≤n≤200000。?

題解:一開(kāi)始想了個(gè)不換根的DP,結(jié)果錯(cuò)了。。。

先選擇一個(gè)點(diǎn)當(dāng)根,那么所有的藍(lán)線(xiàn)一定是 父-子-孫?這樣的。于是我們令g[x]表示當(dāng)前點(diǎn)不是'子'的最大得分,f[x]表示當(dāng)前點(diǎn)是'子'的最大得分,樹(shù)形DP即可。

但是我們?nèi)绾螕Q根呢?我們需要維護(hù)f的最大值和次大值,然后就能搞了。

?

#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn=200010; int n,cnt,ans; int to[maxn<<1],next[maxn<<1],val[maxn<<1],head[maxn],f1[maxn],g[maxn],f2[maxn]; inline void add(int a,int b,int c) {to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++; } inline int rd() {int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();return ret*f; } void dfs1(int x,int fa) {f1[x]=f2[x]=-1<<30;for(int y,i=head[x];i!=-1;i=next[i]) if(to[i]!=fa){y=to[i],dfs1(y,x);int fy=g[y]+val[i]-max(g[y],g[y]+f1[y]+val[i]);if(fy>f1[x]) f2[x]=f1[x],f1[x]=fy;else if(fy>f2[x]) f2[x]=fy;g[x]+=max(g[y],g[y]+f1[y]+val[i]);} } void dfs2(int x,int fa) {ans=max(ans,g[x]);for(int y,i=head[x];i!=-1;i=next[i]) if(to[i]!=fa){y=to[i];int gx=g[x]-max(g[y],g[y]+f1[y]+val[i]),fx;if(f1[x]==g[y]+val[i]-max(g[y],g[y]+f1[y]+val[i])) fx=f2[x];else fx=f1[x];g[y]+=max(gx,gx+fx+val[i]);fx=gx+val[i]-max(gx,gx+fx+val[i]);if(fx>f1[y]) f2[y]=f1[y],f1[y]=fx;else if(fx>f2[y]) f2[y]=fx;dfs2(y,x);} } int main() {n=rd();int i,a,b,c;memset(head,-1,sizeof(head));for(i=1;i<n;i++) a=rd(),b=rd(),c=rd(),add(a,b,c),add(b,a,c);dfs1(1,0),dfs2(1,0);printf("%d",ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/CQzhangyu/p/7898704.html

總結(jié)

以上是生活随笔為你收集整理的【BZOJ3677】[Apio2014]连珠线 换根DP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。