網路流學習總結

2022-05-27 19:18:11 字數 1767 閱讀 3334

設 定義在二元組 上的實數函式且滿足

容量限制:對於每條邊,流經該邊的流量不得超過該邊的容量,即\(f(u,v) \le c(u,v)\)

斜對稱性:每條邊的流量與其相反邊的流量之和為 0,即 \(f(u,v) = -f(v,u)\)

流守恆性:從源點流出的流量等於匯點流入的流量

最大流我們有一張圖,要求從源點流向匯點的最大流量(可以有很多條路到達匯點),就是我們的最大流問題。

最小費用最大流

最小費用最大流問題是這樣的:每條邊都有乙個費用,代表單位流量流過這條邊的開銷。我們要在求出最大流的同時,要求花費的費用最小。

最小割割其實就是刪邊的意思,當然最小割就是割掉 \(x\) 條邊來讓 \(s\) 跟 \(t\) 不互通。我們要求 \(x\)條邊加起來的流量綜合最小。這就是最小割問題。

實現dinic 演算法的過程是這樣的:每次增廣前,我們先用 bfs 來將圖分層。設源點的層數為 ,那麼乙個點的層數便是它離源點的最近距離。

通過分層,我們可以幹兩件事情:

如果不存在到匯點的增廣路(即匯點的層數不存在),我們即可停止增廣。

確保我們找到的增廣路是最短的。(原因見下文)

接下來是 dfs 找增廣路的過程。

我們每次找增廣路的時候,都只找比當前點層數多 的點進行增廣(這樣就可以確保我們找到的增廣路是最短的)。

dinic 演算法有兩個優化:

多路增廣:每次找到一條增廣路的時候,如果殘餘流量沒有用完怎麼辦呢?我們可以利用殘餘部分流量,再找出一條增廣路。這樣就可以在一次 dfs 中找出多條增廣路,大大提高了演算法的效率。

網路流圖中,花費最小的最大流被稱為最小費用最大流,這也是接下來我們要研究的物件。

類似dinic演算法

我們可以在 dinic 演算法的基礎上進行改進,把 bfs 求分層圖改為用 spfa(由於有負權邊,所以不能直接用 dijkstra)來求一條單位費用之和最小的路徑,也就是把 \(w(u,v)\) 當做邊權然後在殘量網路上求最短路,當然在 dfs 中也要略作修改。這樣就可以求得網路流圖的最小費用最大流了。

對於一條邊 \((u,v,w,c)\)(其中 \(w\) 和 \(c\) 分別為容量和費用),我們建立正向邊 (u,v,w,c)和反向邊 \((v,u,0,-c)\)(其中 \(-c\) 是使得從反向邊經過時退回原來的費用)。

上下界網路流本質是給流量網路的每一條邊設定了流量上界 \(c(u,v)\) 和流量下界 \(b(u,v)\) 。也就是說,一種可行的流必須滿足 \(b(u,v) \le f(u,v) \le c(u,v)\) 。同時必須滿足除了源點和匯點之外的其餘點流量平衡。

閉合子圖:

它是一種子圖

它還是有向圖的子圖

它還可以一路走到底

對於每個點,從它出發,能夠走到的所有點都屬於閉合子圖中

最大權閉合子圖就是原圖中點權和最大的閉合子圖。

實現最大權閉合子圖問題可以使用最小割解決

連邊方式

至於 \(val[u] = 0\)(零權點)的情況,向 \(s\) 還是 \(t\)連邊對答案並沒有影響。

直接跑最小割,最大權 = 正點權和 - 最小割,而最大權閉合子圖的節點就是與 \(s\) 聯通的部分。

對於乙個有點權的點來說,拆點就是把乙個點拆開為多個,這樣可以方便把點權變成邊權,滿足題目的一些要求。

對於一些題來說,如果直接加點建邊很有可能因為邊和點過多而掛掉,此時就需要按照題意來進行建邊上的優化。

網路流總結

今天學的網路流,總的感覺來說稍難,不管是理解還是什麼,但是理解了後,就變得簡單許多。ford fulkerson演算法 是來求最大流量問題,從源點出發,到匯點,到底能多少能流入匯點。演算法 1 從源點出發,找相鄰邊,如果相鄰邊未被找過並且還可以流入流量就dfs。2 更新流入的邊。3 重複操作,直到沒...

網路流總結

今天做了一天的網路流,也發現了很多有趣 有毒 的建圖方法,也算是收穫很多了,這裡就做個總結吧。網路流跑的方法大家都會我就不說了,題考察的重點也就是建圖。建圖就涉及到2個方面 1.建點。建點其實就是網路流的難點了,一般點弄好了邊也容易了。建點的困難就在於有時要拆點,我總結了一下拆點主要是這幾個作用 a...

網路流總結

1.hdu1532 給網路圖,求1 n的最大流.注意邊數 2 2.hdu3572 經典建圖模型,有些東西能轉換為容量考慮 網路流演算法.dinic學了乙個多路增廣優化,能少一次遞迴的時間 1.hdu1533 建圖方式,假設有cntm個人,cnth個房子,分別對應編號 1,cntm cntm 1,cn...