这里有用到了PRE的数组,该数组的作用和静态邻接表的原理是一样的。能减少时间复杂度。
详细的解释在上篇文章写到了。
i
详细的解释在上篇文章写到了。
i
nt c[MAX][MAX]; //残留网络容量
int pre[MAX]; //保存增广路径上的点的前驱顶点
bool visit[MAX];
int Ford_Fulkerson(int src,int des,intn){ //src:源点 des:汇点n:顶点个数
int i,_min,total=0;
while(true){
if(!Edmonds_Karp(src,des,n))return total;//如果找不到增广路就返回,在具体实现时替换函数名
_min=(1<<30);
i=des;
while(i!=src){ //通过pre数组查找增广路径上的边,求出残留容量的最小值
if(_min>c[pre[i]][i])_min=c[pre[i]][i];
i=pre[i];
}
i=des;
while(i!=src){ //再次遍历,更新增广路径上边的流值
c[pre[i]][i]-=_min;
c[i][pre[i]]+=_min;
i=pre[i];
}
total+=_min; //每次加上更新的值
}
}
bool Edmonds_Karp(int src,int des,int n){
int v,i;
for(i=0;i
front=rear=0; //初始化
que[rear++]=src;
visit[src]=true;
while(front!=rear){ //将源点进队后开始广搜的操作
v=que[front++];
//这里如果采用邻接表的链表实现会有更好的效率,但是要注意(u,v)或(v,u)有任何一条
//边存在于原网络流中,那么邻接表中既要包含(u,v)也要包含(v,u)
for(i=0;i
if(!visit[i]&&c[v][i]){ //只有残留容量大于0时才存在边
que[rear++]=i;
visit[i]=true;
pre[i]=v;
if(i==des)return true; //如果已经到达汇点,说明存在增广路径返回true
}
}
}
return false;
}