Acwing 287 積蓄程度 (樹形DP換根)

2022-09-16 08:51:13 字數 1932 閱讀 7985

有乙個樹形的水系,由 n-1 條河道和 n 個交叉點組成。

我們可以把交叉點看作樹中的節點,編號為 1~n,河道則看作樹中的無向邊。

每條河道都有乙個容量,連線 x 與 y 的河道的容量記為 c(x,y)。

河道中單位時間流過的水量不能超過河道的容量。

有乙個節點是整個水系的發源地,可以源源不斷地流出水,我們稱之為源點。

除了源點之外,樹中所有度數為 1 的節點都是入海口,可以吸收無限多的水,我們稱之為匯點。

也就是說,水系中的水從源點出發,沿著每條河道,最終流向各個匯點。

在整個水系穩定時,每條河道中的水都以單位時間固定的水量流向固定的方向。

除源點和匯點之外,其餘各點不貯存水,也就是流入該點的河道水量之和等於從該點流出的河道水量之和。

整個水系的流量就定義為源點單位時間發出的水量。

在流量不超過河道容量的前提下,求哪個點作為源點時,整個水系的流量最大,輸出這個最大值。

輸入格式

輸入第一行包含整數t,表示共有t組測試資料。

每組測試資料,第一行包含整數n。

接下來n-1行,每行包含三個整數x,y,z,表示x,y之間存在河道,且河道容量為z。

節點編號從1開始。

輸出格式

每組資料輸出乙個結果,每個結果佔一行。

資料保證結果不超過231−1。

資料範圍

n≤2∗105

輸入樣例:15

1 2 11

1 4 13

3 4 5

4 5 10

輸出樣例:

26這道題目有點像最大流,這題我們採用樹形dp進行換根,因為他要求可能的最大水流,那麼如果我們以每個點為根暴力顯然超時,所以我們只需要剛開始以乙個點為根求出每個點往下的最大流,然後從上往下在dfs一遍,進行dp換根。

#include#include#include#include#include#include#include#includeusing namespace std;

#define rep(i,f_start,f_end) for (int i=f_start;i<=f_end;++i)

#define per(i,n,a) for (int i=n;i>=a;i--)

#define mt(x,i) memset(x,i,sizeof(x) )

#define rev(i,start,end) for (int i=0;ipii;

ll gcd (ll a,ll b)

inline int read()

while('0'<=ch&&ch<='9') return x*f;

}const int maxn=2e5+5;

vector g[maxn];

int n;

int ans;

int d[maxn];

int f[maxn];

int deg[maxn];

int dfs_d (int u,int fa)

d[u]=0;

for (auto it:g[u])

return d[u];

}void dfs_f (int u,int fa)

}}int main ()

g[b].pb (mp (a,c));

deg[a]++,deg[b]++;

}int root=1;

while (root<=n&°[root]==1) root++;

if (root>n)

dfs_d (root,-1);

f[root]=d[root];

dfs_f (root,-1);

ans=0;

rep (i,1,n) ans=max (ans,f[i]);

printf ("%d\n",ans);

}return 0;

}

AcWing 28 在O 1 時間刪除鍊錶結點

給定單向鍊錶的乙個節點指標,定義乙個函式在o 1 時間刪除該結點。假設鍊錶一定存在,並且該節點一定不是尾節點。樣例輸入 鍊錶 1 4 6 8 刪掉節點 第2個節點即6 頭節點為第0個節點 輸出 新鍊錶 1 4 8此題沒有給鍊錶的頭節點,只給了要刪除的節點,比較特殊。我們把要刪除的node節點的nex...

AcWing 28 在O 1 時間刪除鍊錶節點

原題鏈結 題目描述 給定單向鍊錶的乙個節點指標,定義乙個函式在o 1 時間刪除該結點。假設鍊錶一定存在,並且該節點一定不是尾節點。樣例 輸入 鍊錶 1 4 6 8 刪掉節點 第2個節點即6 頭節點為第0個節點 輸出 新鍊錶 1 4 8 解題思路 這個題給的是需要刪除的節點,並不是鍊錶的頭部,這個困擾...

2 8 後向引用

當乙個正規表示式被分組之後,每乙個組將自動被賦予乙個組號,該組號可以代表該組的表示式。其中,組號的編制規則為 從左到右 以分組的左括號 為標誌,第乙個分組的組號為1,第二個分組的組號為2,以此類推。反向引用提供查詢重複字元組的方便的方法。它們可被認為是再次匹配同乙個字串的快捷指令。後向引用可以使用數...