網路流總結

2022-06-13 14:30:13 字數 2215 閱讀 3811

求出乙個二分圖的最大匹配。

二分圖匹配怎麼求?

可以用匈牙利演算法:遍歷每個點,查詢增廣路,若找到增廣路,則修改匹配集合和匹配數;否則終止演算法,返回最大匹配數。這樣時間複雜度是 \(\mathcal(nm)\) 的。**實現:

int con[n * n];

bool vis[n * n];

bool hungary(int u)

} return 0;

}

二分圖有很多優秀的性質:

最大匹配數=最小點覆蓋數,最大獨立集與最大匹配數互補,dag最小路徑覆蓋=dag原圖節點數-對應二分圖最大匹配。

也就是說用簡簡單單小 dfs 就能快速地求出這麼多問題!但是這不夠優秀,我們用網路最大流解決二分圖一類的問題可以達到 \(\mathcal(m\sqrt)\)。所以在這裡介紹一下網路流的解法之類。

當然網路流不僅侷限於二分圖的問題,它還比匈牙利更加靈活。

在開始之前,先了解關於網路流的一些基本概念吧。

有且僅有乙個入度為 \(0\) 的源點 \(s\)。

有且僅有乙個出度為 \(0\) 的匯點 \(t\)。

每條有向邊都有流量上限。

每個點(\(s,t\) 除外)滿足流入等於流出,每條邊滿足流入等於流出且不超過流量上限。

1.從源點出發的流全經過網路到匯點。

飽和弧是指在乙個可行流中,一條通過流量等於流量上限的邊。若是小於,這條邊就叫非飽和弧。

零弧是指在乙個可行流中,一條通過流量為零的邊。

將網路流圖看作是無向圖的情況下,前向弧是指一條方向是和源點流向匯點方向一致的邊,後向弧則反之。

和有向圖的有向邊方向相反的邊。

一段路徑滿足:

所有前向弧都是非飽和弧。

所有後向弧都是非零弧。

對於某一條邊,還能再有多少流量經過。

每次用 bfs 找一條最短的增廣路徑,然後沿著這條路徑修改流量值(實際修改的是殘量網路的邊權)。當沒有增廣路時,演算法停止,此時的流就是最大流。

然後這個過程可以用 dinic 優化:

分層圖優化:dinic 演算法首先對圖進行一次 bfs,然後在其生成的分層圖中多次 dfs。這樣就切斷了原有圖中的許多不必要連線。這樣我們可以進行多路增廣,減少了呼叫增廣函式的次數。

當前弧優化:每次 dfs 完,找到路徑中容量最小的一條。在這條邊之前的路徑的容量大於等於這條邊的容量。那麼從這條邊之前的點,可能引發出別的增廣路徑。

-1 優化:在同一次 dfs 中,如果從乙個點引發不出任何增廣路徑,就讓它在層次圖里抹去。

int n, m, s, t, tot;

struct edge

e[m];

int head[n];

void add(int x, int y, int w)

; head[x] = tot;

e[++tot] = (edge);

head[y] = tot;

}int dis[n];

queue que;

bool bfs()

} }return 0;

}ll dfs(int x, ll f)

} return sum;

}ll dinic()

return sum;

}

首先,割是一組邊,如果去掉割邊,\(s,t\) 就不會聯通,那麼最小割就是這組邊的最小價值。

其次,最小割等於最大流,不會證明。

bfs 換成 spfa。

int n, m, s, t, tot;

struct edge

e[m];

int head[n];

void add(int x, int y, int w, int z)

; head[x] = tot;

e[++tot] = (edge);

head[y] = tot;

}int dis[n], incf[n], pre[n];

bool vis[n];

queue que;

bool spfa()

} }if (dis[t] == 1010580540)

return 0;

else

return 1;

}int maxflow, mincost;

void mcmf()

}}

網路流總結

今天學的網路流,總的感覺來說稍難,不管是理解還是什麼,但是理解了後,就變得簡單許多。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...