This algorithm doesn't seem to have a name. Is that every time SPFA augmented.
Time Complexity O (n*m^2*3).
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std;
const int maxn=5005,maxe=100005;
int n,m,nxt[maxe],s,t,fir[maxn],tot=1,f[maxn],dis[maxn],path[maxn],ans1,ans2; struct Edge {int from,to,cap,flow,cost;}
Es[maxe];
Queue <int> que;
BOOL VIS[MAXN];
void Add (int x,int y,int w,int c) {es[++tot]= (Edge) {x,y,w,0,c}; NXT[TOT]=FIR[X];
Fir[x]=tot;
Es[++tot]= (Edge) {y,x,0,0,-c}; Nxt[tot]=fir[y];
Fir[y]=tot;
BOOL FIND_SPFA (int s,int t,int &maxflow,int &mincost) {memset (f,0,sizeof (f)) f[s]=1e+9; memset (dis,63,sizeof (dis));
dis[s]=0;
memset (Vis) (vis,0,sizeof);
while (!que.empty ()) Que.pop ();
Que.push (s);
while (!que.empty ()) {int X=que.front (); Que.pop ();
Vis[x]=false;
for (int j=fir[x];j;j=nxt[j]) {if (es[j].cap>es[j].flow&&dis[x]+es[j].cost<dis[es[j].to]) {
Dis[es[j].to]=dis[x]+es[j].cost; PATH[ES[J]. to]=j;
F[es[j].to]=min (F[x],es[j].cap-es[j].flow);
if (!vis[es[j].to]) vis[es[j].to]=true, Que.push (es[j].to);
}} if (!f[t]) return false; MAXFLOW+=F[T];
MINCOST+=F[T]*DIS[T];
for (int i=t;i!=s;i=es[path[i]].from) {es[path[i]].flow+=f[t];
ES[PATH[I]^1].FLOW-=F[T];
return true;
int main () {scanf ("%d%d%d%d", &n,&m,&s,&t);
for (int i=1;i<=m;i++) {int x,y,z,c; scanf ("%d%d%d%d", &x,&y,&z,&c);
Add (X,Y,Z,C);
} ans1=ans2=0;
while (FIND_SPFA (S,T,ANS1,ANS2));
printf ("%d%d\n", ans1,ans2);
return 0; }