增廣路演算法入門

2021-09-26 07:12:35 字數 1210 閱讀 4513

增廣路定理:

我們用未覆蓋點來表示不與任何匹配邊鄰接的點,其他點為匹配點,即恰好和一條匹配邊鄰接的點。從未覆蓋點出發,依次經過非匹配邊,匹配邊,非匹配邊,匹配邊…所得的路稱為交替路。如果交替路的終點是乙個未覆蓋點,則稱這條交替路為一條增廣路,非匹配邊比匹配邊多一條。

增廣路的作用是改進匹配,假設我們已經找到乙個匹配,如何判斷他 是否是最大匹配?看增廣路,如果有一條增廣路,呢麼把此路上的匹配邊和非匹配邊互換,得到的匹配邊比剛才多一條。反之,若找不到增廣路,則當前為最大匹配

乙個匹配是最大匹配的充要條件是不存在增廣路,這個充要條件適用於任意圖。
增廣路演算法:

根據增廣路定理,最大匹配可以通過反覆尋找增廣路來求解,如何找到答案?根據定義首先找到乙個未覆蓋的點u作為起點,設這個u是x的結點。接下來需要選乙個從u出發的非匹配邊(u,v),達到y結點v。如果v是未覆蓋點。說明我們成功找到了一條增廣路,如果v是匹配點,那我們下一不得走匹配邊,因為乙個匹配點恰好與乙個匹配邊鄰接。設匹配點v鄰接的匹配邊的另一端點left[v],呢麼可以理解從u直接走到了left[v],而這個left[v]也是乙個x結點。如果始終沒有找到覆蓋點,最後會擴充套件出一顆匈牙利樹。

這樣,我們得到了乙個演算法,即每次選乙個未覆蓋點u進行dfs,注意,如果找不到u開頭的增廣路,則換乙個未覆蓋點進行dfs,且以後再也不從u出發找增廣路。換句話說,如果以後存在乙個從出發的增廣路,呢麼現在就找得到。

**:

#includeusing namespace std;

const int maxn=600+5;

bool line[maxn][maxn];

//line[x][y]=true表示x號女生喜歡y男生(邊)

int boy[maxn];

//儲存y號男生匹配邊另一端的匹配點女生,如果是未覆蓋點則為0

bool use[maxn];

//儲存y號男生是否在這條交替路上被使用過,男生是否被別人喜歡

int k,n,m;

bool dfs(int x)

}//該條路不是增廣路

}return false;

}int main()

for(int i=1;i<=n;i++)

cout<}

return 0;

}

增廣路演算法Ford Fulkerson

無題目 該演算法就是不斷在殘餘網路中尋找增廣路 並增廣 直到找不到增廣路為止 也就是說,此時源點和匯點不連通,存在割 下面給出增廣路和增廣的含義。演算法實現 const maxn 200 varc array 1.maxn,1.maxn of longint b array 1.maxn of lo...

最大流的增廣路演算法

模板題目鏈結 洛谷p3376 模板來自演算法競賽入門經典 第2版 劉汝佳 include using namespace std define inf 0x3f3f3f3f typedef long long ll const int maxn 100010 struct edge 記錄這條邊的資訊...

網路流之增廣路演算法

這部分內容在 演算法競賽入門經典 劉汝佳 裡面講的已經很詳細了。但裡面對於反向流量的作用是沒有說明的。這裡只說一下反向流量的作用。推薦上看下。反向流量能夠讓後面的流自我調整。例如當前狀態下 當前狀態下如何尋找?用a表示殘量,cap表示容量,很明顯,3 4這條路不是最優的.更新流量得到 可以看到,通過...