设f为边的流量,s为源点,t为汇点,c为边的容量
fordfulkerson算法就是
(1)只利用满足f(e)<c(e)的e或者满足f(e)>0的e 对应的反向边rev(e),寻找到一条s到t的路径
(2)如果不存在满足条件的路径则结束,否则,沿该路径尽可能地增加流,返回第一步.
满足1条件的边所组成的图叫做残留网络,残余网络上的s-t路径为增广路
代码实现
struct edge
{
int to,cap,rev;//终点,容量,反向边
};
vector<edge> G[max_n];
bool used[max_n];
void add(int from ,int to,int cap)//增加一条form到to的容量为cap的边,和一条反向边
{
edge e;
e.to=to;
e.cap=cap;
e.rev=G[to].size();
G[from].push_back(e);
e.to=from;
e.cap=0;
e.rev=G[from].size()-1;
G[to].push_back(e);
}
int dfs(int v,int t,int f)//求残留网络s-t的最大流
{
if(v==t) return f;
used[v]=true;
for(int i=0;i<G[v].size();i++)
{
edge &e =G[v][i];
if(!used[e.to] && e.cap>0)
{
int d=dfs(e.to,t,min(f,e.cap));
if(d>0)
{
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int max_flow(int s,int t)
{
int flow=0;
while(1)
{
memset(used,0,sizeof(used));
int f=dfs(s,t,inf);
if(f==0) return flow;
flow+=f;
}
}