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

        歡迎訪問 生活随笔!

        生活随笔

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

        编程问答

        nssl1163-小x游世界树【树形dp,二次扫描和换根法】

        發(fā)布時(shí)間:2023/12/3 编程问答 34 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 nssl1163-小x游世界树【树形dp,二次扫描和换根法】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

        正題


        題目大意

        一棵樹,一條邊的權(quán)是原本的權(quán)值減去出發(fā)點(diǎn)的加速。
        求一個(gè)點(diǎn)使得這個(gè)點(diǎn)到所有點(diǎn)路徑邊權(quán)和最小。


        解題思路

        我們先求出以1為根時(shí)的答案
        然后用換根法

        我們從1轉(zhuǎn)移到2,我們會(huì)發(fā)現(xiàn)

        紅色的部分的路徑都減去的紫色的路徑長度,藍(lán)色的部分路徑長度都加上這條紫色的路徑(注意因?yàn)槌霭l(fā)點(diǎn)不同所以權(quán)值不同)
        所以我們推出根轉(zhuǎn)移方程
        fy=fx?numy?(w?movx)+(n?numy)?(w?movy)f_y=f_x-num_y*(w-mov_x)+(n-num_y)*(w-mov_y)fy?=fx??numy??(w?movx?)+(n?numy?)?(w?movy?)


        code

        #include<cstdio> #include<algorithm> #include<cstring> #define ll long long #define N 700010 using namespace std; struct line{ll to,w,next; }a[N*2]; ll ls[N],mov[N],x,y,w,n,f[N],num[N],tot,ans; int read(){char c=getchar();int x=0;for(;'0'>c||c>'9';c=getchar());for(;'0'<=c&&c<='9';c=getchar()) x=x*10+(c-'0');return x; } void addl(ll x,ll y,ll w) {a[++tot].to=y;a[tot].w=w;a[tot].next=ls[x];ls[x]=tot; } void dp(ll x,ll fa)//計(jì)算第一個(gè)答案和子樹大小 {num[x]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y!=fa){dp(y,x);f[1]+=max(a[i].w-mov[x],0ll)*num[y];num[x]+=num[y];}} } void dp2(ll x,ll fa)//轉(zhuǎn)移根 {if(f[x]<f[ans]||(f[x]==f[ans]&&x<ans)) ans=x;//統(tǒng)計(jì)答案for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y!=fa){f[y]=f[x]-num[y]*(a[i].w-mov[x])+(n-num[y])*(a[i].w-mov[y]);//動(dòng)態(tài)轉(zhuǎn)移dp2(y,x);}} } int main() {n=read();for(ll i=1;i<=n;i++)mov[i]=read();for(ll i=1;i<n;i++){x=read();y=read();w=read();addl(x,y,w);addl(y,x,w);}dp(1,0);ans=1;dp2(1,0);printf("%lld\n%lld",ans,f[ans]); }

        總結(jié)

        以上是生活随笔為你收集整理的nssl1163-小x游世界树【树形dp,二次扫描和换根法】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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