网络流模板--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];      /*更新反向流量*/
        }
    }
}

你可能感兴趣的:(网络流模板--edmondsKarp)