分类: 系统运维
2009-07-17 23:41:51
Ford_Fulkerson( G, s, t ){
for each edge( u, v )∈E[G]
do f[u,v]= 0
f[v,u]= 0
while there exists a path p from s to t in the residual network Gf
do Cf(p)= min{ Cf(u,v) | (u,v) is in p }
for each edge(u,v) in p
do f[u,v]+= Cf(p)
f[v,u]= -f[u,v]
#define VMAX 201
int n, m; //分别表示图的边数和顶点数
int c[VMAX][VMAX];
int Edmonds_Karp( int s, int t ){ //输入源点和汇点
int p, q, queue[VMAX], u, v, pre[VMAX], flow= 0, aug;
while(true){
memset(pre,-1,sizeof(pre)); //记录父节点
for( queue[p=q=0]=s; p<=q; p++ ){ //广度优先搜索
u= queue[p];
for( v=0; v
if( c[u][v]>0 && pre[v]<0 )
pre[v]=u, queue[++q]=v;
if( pre[t]>=0 ) break;
}
if( pre[t]<0 ) break; //不存在增广路
aug= 0x7fff; //记录最小残留容量
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
if(c[u][v]<aug) aug=c[u][v];
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
c[u][v]-=aug, c[v][u]+=aug;
flow+= aug;
}
return flow;
}