網路流 EK演算法及其優化

2022-08-01 14:33:18 字數 1373 閱讀 1830

今天上午我彷彿知道了什麼叫做網路流,這裡推薦一篇部落格,大家入門網路流的可以看一下這篇部落格,保證一看就懂!

//codevs 1993

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x7ffffff;

queue

q;int n,m,x,y,s,t,g[201][201],pre[201],flow[201],maxflow;

//g鄰接矩陣存圖,pre增廣路徑中每個點的前驅,flow源點到這個點的流量 (就是増廣路(min))!

inline

int bfs(int s,int t)

}if (pre[t]==-1) return -1;//死啦!

else

return flow[t];

}//increase為增廣的流量

void ek(int s,int t)

maxflow+=increase;//增加増廣路

}}int main()

ek(1,n);

printf("%d",maxflow);

return

0;}

下面大家就會發現乙個問題,用鄰接矩陣儲存,是不是也太費空間了,要是題目讓你跑乙個有10000個點的網路流豈不涼涼!!!

下面就要獻上我們改裝過的ek演算法!(說白了就是dinic)

#include

using

namespace

std;

struct listxedge[200005];

int cnt=0,n,m,s,t;

int head[10005];

int depth[10005];

void update(int num,int flow)

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

bool bfs()

que.push(s);

depth[s]=1;

while(!que.empty())}}

if(depth[t]==0)

return

false;

return

true;

}int dfs(int u,int flow)}}

return

0;

}int main()

while(bfs())

}printf("%d",ans);

return

0;}

網路流 EK演算法

ek演算法的思路 基於貪心的思想,每次選取一條起點到終點的路徑,毋庸置疑,這條路的流量就等於這條路徑上的權值是最小值。將這條路的權值都減去流量,再將路徑的反向邊加上流量 這樣可以就給貪心一次反悔的機會 無限迴圈以上步驟,到找不到任何一條起點到終點的路,最後所有的最小值加起來就是最大流了。這只是我對e...

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

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

網路流最大流 EK演算法

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