問題 \(\rightarrow\) 某種方式建圖的網路流 \(\rightarrow\) 網路流解與原問題解是否等價。
流網路是乙個有向圖\(g\),其中有兩個特殊點 \(s,t\in v\) ,分別為源點和匯點。\(g\) 中每一條邊有乙個 \(\ge 0\) 的權值,稱作邊的容量,邊 \((u,v)\) 容量可記做 \(c(u,v)\)。
源點相當於乙個水源,匯點相當於乙個大海,中間的邊和點相當於河流水道,水從水源流出,流經河道,流向大海。容量描述的就是這些河流水道的寬度/深度/etc.。
為了簡化問題,我們假設若存在邊 \((u,v)\in e\),則不存在 \((v,u)\in e\) 。
其實我們也有一種辦法消除這種邊,只需要將 \((v,u)\) 拆成 \((v,t)\) 和 \((t,u)\) 就可以了。
總之,在考慮問題時,不用考慮反向邊。
對於每乙個流網路,我們可以考慮它的任意乙個可行流(可簡稱流),流用 \(f\) 來表示,\(f(u,v)\) 表示的是單位時間內從 \(u\) 點到 \(v\) 點流經邊 \((u,v)\) 的流。
通俗的來說,就是河道裡面流了多少水。
就是說我們要指定每一條邊的流量得到乙個方案 \(f\) ,若滿足兩個條件:容量限制和流量守恆,則稱這個 \(f\) 是乙個可行流。
容量限制:流經邊的流量小於等於邊的容量,即:
\[0 \le f(u,v) \le c(u,v)
\]流量守恆:除了源點匯點之外其他點不能儲存流量。也就是說,流入的流量之和應該等於流出的流量之和,即:
\[\sum_f(u,v)=\sum_f(v,u)
\]我們完全不用考慮反向邊。
對於乙個可行流 \(f\) ,\(|f|\) 代表這個可行流的流量值,表示流從源點流向匯點的速率。我們定義:
\[|f|=\sum_f(s,v)-\sum_ f(v,s)
\]就是單位時間內從源點流出的總流量減去從源點流入的總流量。
最大流,也叫最大可行流,乙個流 \(f\) 是最大流當且僅當 \(|f|\) 最大。
定義乙個有向圖 \(g\) 對應乙個可行流 \(f\) 的殘留網路 \(g_f\) ,其 \(v_f=v\ ,\ e_f=e+\\),其每條邊的容量 \(c^(u,v)\) 與原圖及對應可行流 \(f\) 的關係如下:
\[c^(u,v)=
\begin
c(u,v)-f(u,v) &,&(u,v)\in e\\
\\f(v,u) &,&(v,u)\in e
\end
\]可以看出,對於原網路的任意乙個可行流都可以建立乙個殘留網路。
上圖示:(紅色為可行流,藍色為容量)
這個網路的殘留網路應為:(紅色為反向邊及其權值,藍色為原圖有的邊及其權值)
殘留網路的性質在殘留網路裡面,從源點開始沿容量大於0的邊走到匯點的簡單路徑稱為增廣路徑,也叫流增廣路徑。
增廣路徑一定是原網路的乙個可行流。
性質有向圖 \(g\) 的割為點集 \(v\) 的乙個劃分方案 \(\) 使得 \(s\cap t=\varnothing,s\cup t=v\)。
乙個割 \(\) 的容量 \(c(s,t)\) 為
\[c(s,t) = \sum_\sum_ c(u,v)
\]最小割指的一般是最小容量割。
乙個割 \(\) 在可行流 \(f\) 下的流量 \(f(s,t)\) 為
\[f(s,t)=\sum_\sum_f(u,v)-\sum_\sum_f(u,v)
\]運算方式
接下來定義點集子集(不一定沒有交集)之間的流量運算方式
對於點集 \(x,y\subsetneq v\)
\[f(x,y)=\sum_\sum_f(u,v)-\sum_\sum_f(u,v)
\]推出如下運算律:
\(f(x,y)=-f(y,x)\)
\(f(x,x)=0\)
\(f(z,x\cup y)=f(z,x)+f(z,y)\)
\(f(x\cup y,z)=f(x,z)+f(y,z)\)
性質對於任意割 \(\) ,其流量一定小於等於容量。
定義式相加易得。
對於割 \(\),其對應的可行流的值 \(|f|=f(s,t)\)。
由流量守恆原則易得。
對於任意乙個 \(f\) ,有 \(|f|\le c(s,t)\) 對任意割成立。
推論:最大流流量小於等於最小割容量
對於乙個網路 \(g\) ,乙個流 \(f\) 是最大流 \(^①\) ,等價於 \(g\) 的殘留網路 \(g_f\) 中沒有增廣路 \(^②\),等價於存在乙個割 \(\) 使得 \(|f|=c(s,t)^③\) 。
證明:
\[\begin
①\rightarrow②:&
設f是圖g的最大流\\
&假設殘留網路g_f存在增廣路|f^|>0\\
&\because f+f^一定為可行流and |f+f^|>f\\
&\therefore 假設不成立\\
&故原命題成立\\
\end\\
\ \\
\begin
②\rightarrow③:&
定義s為在g_f中從s開始沿著容量大於0的邊走左右能走到的點。\\
&可以知道,由於g_f沒有增廣路,所以t\notin s\\
&令:t=v-s(v為整個圖所有點的點集)\\
&則是乙個合法的割。\\
&任取x\in s, y\in t\\
&\because g_f沒有增廣路\\
&\therefore f(x,y)=c(x,y)當(x,y)\in e\\
&\quad f(y,x)=0,當(y,x)\in e\\
&\because |f|=f(s,t)=\sum_\sum_f(u,v)-\sum_\sum_ f(v,u)\\
&\therefore |f|=\sum_\sum_c(u,v)=c(s,t)
\end\\
\ \\
\begin
③\rightarrow①:&
設f為圖g的可行流,f_ 為圖g的最大流。\\
&\therefore |f|\le |f_|\\
&\because |f|=c(s,t)\\
&又\because c(s,t)\ge |f_|\\
&\therefore f=f_\\
\\\end\\
綜上,①\leftrightarrow ②\leftrightarrow ③,q.a.d
\]基於最大流最小割定理,我們可以得到如下方法求解最大流。
輸入乙個網路 \(g\)
確定乙個可行流 \(f\),為當前可行流
在其殘留網路\(g_f\)中尋找增廣路徑 \(f^\)。
更新當前可行流為 \(f+f^\)
轉3,若找不到增廣路,輸出當前可行流。
網路流基本概念
網路流是圖論中乙個博大精深的分支。其最主要的難點在於各種模型的建立,我們需要熟練掌握其中的演算法模板並且充分理解其原理,積累建圖經驗,才能在遇到網路流的題目時從容應對。本篇blog主要介紹網路流的基本概念,弄清楚這些概念 定理及理解其證明,對於後面的學習會頗有助益。乙個流網路g v,e 是一張有向圖...
網路流學習 一 基本概念
容量網路 設g v,e 是乙個有向網路,在v中指定了乙個頂點,稱為源點 記為vs 以及另乙個頂點,稱為匯點 記為vt 對於每一條弧屬於e,對應有乙個權值c u,v 0,稱為弧的容量.通常吧這樣的有向網路g稱為容量網路.弧的流量 通過容量網路g中每條弧,上的實際流量 簡稱流量 記為f u,v 網路流 ...
樹 定義和基本概念
一 樹 tree 是n n 0 個結點的有限集。n 0時稱為空樹。在任意一棵非空樹中 1 有且僅有乙個特定的稱為根 root 的結點。2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集t1,t2,tm,其中每乙個集合本身又是一棵樹,並且稱為根的子樹 subtree 如圖1所示 樹的定義之中...