網路流相關 最大流和費用流的EK演算法實現

2022-06-06 07:21:12 字數 2038 閱讀 9639

luogu p3376

最大流是網路流模型的乙個基礎問題。

網路流模型就是一種特殊的有向圖。

概念:對於網路流模型\(g=(v,e)\)(\(v\)為點集,\(e\)為邊集)有如下性質:

最大流問題,用通俗的方式解釋就是從源點s到匯點t輸送流量,詢問最多有多少流量能輸送到匯點。

對於這樣的問題,我們引入一些新概念:

\(ford-fulkerson\)方法:每一次尋找一條增廣路徑。根據木桶原理,該增廣路的最大流量\(f_<=min(c(x,y)-f(x,y))\)。據此從源點傳送流量至匯點並修改路徑上所有弧的殘量,直到無法找到增廣路為止。

\(edmons-karp\)演算法:基於\(ford-fulkerson\)方法的一種演算法,核心就是利用\(bfs\)搜尋源點到匯點的最短增廣路,根據\(ford-fulkerson\)方法修改殘量網路。複雜度最壞是\(o(nm^2)\)

所以其實我們在求最大流相關問題時,其實只利用到了殘量網路,流量和容量一般並不需要記錄。

關鍵點:有時候在求最大流時我們可能需要縮減一條邊的流量,所以我們引入了反向邊。當我們選用了一條反向邊時,相當於縮減正向邊的流量。很容易發現反向邊的殘量等於正向邊的流量(最多恰好抵消正向流量)。

這樣就能保證演算法的正確性。

#include#include#include#includeusing namespace std;

struct data

e[2*100005];

int cnt,head[10005],prep[10005],pree[10005],flow[10005],ans;

queueque;

int n,m,s,t,u,v,w;

void add(int u,int v,int w)

int bfs(int s,int t)

prep[s]=0;

while (!que.empty())

}} if (prep[t]!=-1) return flow[t];

else return -1;

}void ek(int s,int t)

delta=bfs(s,t); }}

int main()

ek(s,t);

printf("%d",ans);

return 0;

}

luogu p3381

假設現在對每一條弧加入乙個費用,表示該弧單位流量需要的費用,要求最小費用最大流。

那麼這就是費用流問題。

事實上並不難,對ek演算法稍作修改,將ek中bfs尋找最短增廣路改成spfa尋找最小費用的增廣路即可

#include#includeusing namespace std;

const int maxn=5005,maxm=50005,inf=0x3f3f3f3f;

struct data

e[2*maxm];

int cnt,tot,ans,head[maxn],n,m,s,t,u,v,w,f,cost[maxn],prep[maxn],pree[maxn],flow[maxn];

void add(int u,int v,int w,int f)

queueque;

int vis[maxn];

int spfa(int s,int t)

cost[s]=0;

que.push(s);

vis[s]=true;

prep[s]=0;pree[s]=0;flow[s]=inf;

while (!que.empty())

}} }

if (prep[t]!=-1) return flow[t];

else return -1;

}void ek(int s,int t)

delta=spfa(s,t); }}

int main()

ek(s,t);

printf("%d %d",ans,tot);

return 0;

}

網路流最大流 EK演算法

網路流是模仿水流解決生活中類似問題的一種方法策略,來看這麼乙個問題,有乙個自來水廠s,它要向目標t提供水量,從s出發有不確定數量和方向的水管,它可能直接到達t或者經過更多的節點的中轉,目前確定的是每條水管中水流的流向是確定的 單向 且每個水管單位時間內都有屬於自己的水流量的上限 超過會爆水管 問題是...

網路流 最大流演算法之EK

首先是網路流中的一些定義 v表示整個圖中的所有結點的集合.e表示整個圖中所有邊的集合.g v,e 表示整個圖.s表示網路的源點,t表示網路的匯點.對於每條邊 u,v 有乙個容量c u,v c u,v 0 如果c u,v 0,則表示 u,v 不存在在網路中。相反,如果原網路中不存在邊 u,v 則令c ...

網路流 費用流Ek演算法講解

前一篇部落格寫的是最大流。先簡要說一下思路,方便下面的講解。最大流求解是先跑一遍bfs,把每個點定義乙個深度,跑dfs的同時連線一條反向邊方便反悔,避免不必要的時間。現在說一下費用流。費用流的全稱是最小費用最大流 或最大費用最大流 保證最小費用的情況下跑最大流。最小費用?bfs spfa成功解決。我...