Algorithm 网络流最大流(代码)(Edmond-Karp算法)

这里有用到了PRE的数组,该数组的作用和静态邻接表的原理是一样的。能减少时间复杂度。
详细的解释在上篇文章写到了。
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值