Max Flow
Jump to navigation
Jump to search
Max Flow imprement with scaling algorithm O(nmlgU)
#include<stdio.h> #include<algorithm> #include<vector> #define INF 2000000000 using namespace std; struct Edge { int v,w,u; }; vector<Edge*> E[1005]; int ch[1005]; Edge *root; int T; bool dfs(int x,int lt,int k) { int a; if(x==lt) return 1; ch[x]=T; for(a=0;a<E[x].size();a++) if(ch[E[x][a]->w]!=T && E[x][a]->u>=k) if(dfs(E[x][a]->w,lt,k)) { E[x][a]->u-=k; if((E[x][a]-root)%2) root[E[x][a]-root-1].u+=k; else root[E[x][a]-root+1].u+=k; return 1; } return 0; } int maxflow(int n,int m,int s,int t,Edge *edges,int *f) { int a,k=0; bool tmp; root=edges; for(a=0;a<m;a++) { E[edges[a].v].push_back(&edges[a]); f[a]=edges[a].u; if(k<f[a]) k=f[a]; } for(T=1;k>0;T++) if(!dfs(s,t,k)) k/=2; //maxflow ver. scaling algor O(nmlgU) for(a=0;a<m;a++) f[a]-=edges[a].u; for(a=0,k=0;a<E[t].size();a++) k+=E[t][a]->u; return k; }