From 573fd55940b4c23b28de2d0349592050db6a54d0 Mon Sep 17 00:00:00 2001 From: Adarsh <46349391+4d4r5h@users.noreply.github.com> Date: Mon, 10 Oct 2022 21:02:28 +0530 Subject: [PATCH] Create Download Speed.cpp Edmonds-Karp Algorithm --- cses/Download Speed.cpp | 80 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 cses/Download Speed.cpp diff --git a/cses/Download Speed.cpp b/cses/Download Speed.cpp new file mode 100644 index 0000000..d79cc02 --- /dev/null +++ b/cses/Download Speed.cpp @@ -0,0 +1,80 @@ +// The Edmonds-Karp algorithm is an implementation of the Ford-Fulkerson method for computing a maximal flow in a flow network. + +#include +#define int long long +using namespace std; + +int c[501][501]; +int flowPassed[501][501]; +vector g[501]; +int parList[501]; + +bool bfs(int sNode, int eNode) +{ + memset(parList,-1,sizeof(parList)); + queue q; + q.push(sNode); + parList[sNode]=-1; + while(!q.empty()) + { + int currNode=q.front(); + q.pop(); + for(int i=0; iflowPassed[currNode][to]) + { + parList[to]=currNode; + if(to==eNode) + { + return true; + } + q.push(to); + } + } + } + return false; +} + +int edmondsKarp(int sNode, int eNode) +{ + int maxFlow=0; + while(bfs(sNode, eNode)) + { + int flow=LONG_LONG_MAX; + int currNode=eNode; + while(currNode!=sNode) + { + int prevNode=parList[currNode]; + flow=min(flow, c[prevNode][currNode]-flowPassed[prevNode][currNode]); + currNode=prevNode; + } + maxFlow+=flow; + currNode=eNode; + while(currNode!=sNode) + { + int prevNode=parList[currNode]; + flowPassed[prevNode][currNode]+=flow; + flowPassed[currNode][prevNode]-=flow; + currNode=prevNode; + } + } + return maxFlow; +} + +signed main() +{ + int n,m; + cin>>n>>m; + int source=1, sink=n; + for(int i=0; i>u>>v>>cap; + c[u][v]+=cap; + g[u].push_back(v); + g[v].push_back(u); + } + int maxFlow=edmondsKarp(source,sink); + cout<