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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Accumulation Degree题解

發(fā)布時間:2023/12/8 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Accumulation Degree题解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原題傳送門
題目大意:有一個樹形的水系,其中有nnn個節(jié)點,有n?1n-1n?1條邊。xxx,yyy兩點之間的容量用c(x,y)c(x,y)c(x,y)表示。nnn個點中有一個點可以作為源點,可以不斷地流出水。所有度數(shù)為111的點都為匯點,水可以從該點流出。然后求以哪個點作為源點可以使得整個水系的流量最大。

先來考慮暴力,我們?nèi)∶總€點為源點,然后這個就成了個有根樹。

現(xiàn)在以第666號節(jié)點為源點

不難發(fā)現(xiàn),每個點都是從它的父親節(jié)點獲得水,并流向它的兒子節(jié)點

D[x]D[x]D[x]來表示以xxx為根的子樹中,從xxx出發(fā)流向子樹的最大流量
D[x]=∑y∈Son(x){min(D[y],c(x,y))y的度數(shù)>1c(x,y)y的度數(shù)=1D[x]=\sum_{y\in Son(x)}\begin{cases} min(D[y],c(x,y))& y的度數(shù)>1\\ c(x,y)& y的度數(shù)=1 \end{cases} D[x]=ySon(x)?{min(D[y],c(x,y))c(x,y)?y數(shù)>1y數(shù)=1?
對于我們要枚舉的每個源點sss,可以用樹形DP求出D[x]D[x]D[x]數(shù)組

void dp(int x) {v[x]=1;//訪問標記d[x]=0;for(int i=Link[x];i;i=a[i].Next){int y=a[i].y;if(v[y]){continue ;}dp(y);int v=a[i].v;if(deg[y]==1){d[x]+=v;}else{d[x]+=min(d[y],v);}} }

但是枚舉每個根節(jié)點的復雜度是承受不了的。

此時我們就得用不那么暴力的換根法

二次掃描與換根法代替源點的枚舉

先任選一個源點為根節(jié)點,設該點為rootrootroot,用上面的函數(shù)跑一遍,得到DrootD_{root}Droot?

F[x]F[x]F[x]為把xxx作為源點的最大流量。對于我們設的根節(jié)點rootrootroot,顯然有D[root]=F[root]D[root]=F[root]D[root]=F[root]

F[x]F[x]F[x]已經(jīng)知道了,則考慮其子節(jié)點yyy,F[y]F[y]F[y]分為兩部分:

1.從yyy流向以yyy為根的子樹的流量,已經(jīng)計算并存在D[y]D[y]D[y]中了

2.從yyy沿著父親節(jié)點的路線,流到其他的節(jié)點。




因為把xxx作為源點的總流量為F[x]F[x]F[x],從xxx流向yyy的流量為min(D[y],c(x,y))min(D[y],c(x,y))min(D[y],c(x,y)),所以從xxx流向除yyy以外的其他部分的流量就是它們的差。

因此將yyy作為源點,先流到xxx,再流向其他部分的流量就是這個差災區(qū)和c(x,y)c(x,y)c(x,y)取最小值的結果
F[y]=D[y]+{min(F[x]?min(D[y],c(x,y)),c(x,y))x的度數(shù)>1c(x,y)x的度數(shù)=1F[y]=D[y]+\begin{cases} min\left(F[x]-min(D[y],c(x,y)),c(x,y)\right)& x的度數(shù)>1\\ c(x,y)&x的度數(shù)=1 \end{cases} F[y]=D[y]+{min(F[x]?min(D[y],c(x,y)),c(x,y))c(x,y)?x數(shù)>1x數(shù)=1?
F[y]F[y]F[y]就是把源點從xxx換成yyy后,流量的計算結果。

void dfs(int x) {v[x]=1;for(int i=Link[x];i;i=a[i].Next){int y=a[i].y;if(v[y]){continue ;}int v=a[i].v;if(deg[x]==1){f[y]=d[y]+v;}else{f[y]=d[y]+min(f[x]-min(d[y],v),v);}dfs(y);} }

最后的代碼就不貼了,就是求出fff數(shù)組之后求個maxmaxmax就完事了

總結

以上是生活随笔為你收集整理的Accumulation Degree题解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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