网络流模板--edmondsKarp


#define MAX_NUMBER 10000
#define INF 1000

int cap[MAX_NUMBER][MAX_NUMBER];    /*边的容量*/
int flow[MAX_NUMBER][MAX_NUMBER];    /*边的流量*/
int father[MAX_NUMBER];       /*记录每一个点的前趋顶点*/
int queue[MAX_NUMBER];
int vis[MAX_NUMBER];


int edmondsKarp(int source, int destination) {
    int max_flow = 0;
    int front, rear;
    int current_point, i, last_point;
    memset(flow, 0, sizeof(flow));
    while (1) {
        memset(vis, 0, sizeof(vis));
        front = 0;
        rear = 1;
        queue[front] = source;
        vis[source] = INF;
        while (front < rear) {     /*采用bfs来寻找增广路*/
            current_point = queue[front];
            for (i = 1; i <= point_number; i++) {
                if (!vis[i] && cap[current_point][i] > flow[current_point][i]) {
                    father[i] = current_point;
                    queue[rear] = i;
                    if (cap[current_point][i] - flow[current_point][i] < vis[current_point]) {
                        vis[i] = cap[current_point] - flow[current_point][i];
                    }
                    else {
                        vis[i] = vis[current_point];
                    }
                }
            }
            front++;
        }
        if (vis[destination] == 0) {          /*没有寻找到增广路*/
            break;          
        }
        for (last_point = destination; last_point != source; last_point = father[last_point]) {  /*更新流量*/
            flow[father[last_point]][last_point] += vis[destination];      /*更新正向流量*/
            flow[last_point][father[last_point]] -= vis[destination];      /*更新反向流量*/
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值