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成功解決。我...