有乙個樹形的水系,由 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,以此類推。反向引用提供查詢重複字元組的方便的方法。它們可被認為是再次匹配同乙個字串的快捷指令。後向引用可以使用數...