poj1273

来源:互联网 发布:千千秀字软件 编辑:程序博客网 时间:2024/06/08 17:11

网络最大流

#include<cstdio>#include<cstring>#define MAXM 205#define INF 2000000005struct Arc_Infor{    int c, f;};Arc_Infor Edge[MAXM][MAXM];int flag[MAXM], pre[MAXM], change[MAXM];int que[MAXM];int N, M;void Ford() {    while(1) {        memset(flag, -1, sizeof(flag));        memset(pre, -1, sizeof(pre));        memset(change, 0, sizeof(change));        flag[1] = 0;        change[1] = INF;        int front = 0, rear = 0;        que[rear ++] = 1;        while(front < rear) {            int v = que[front];            front ++;            if(flag[M] != -1) {                break;            }            for(int i = 1; i <= M; ++ i) {                if(Edge[v][i].c - Edge[v][i].f != 0 && flag[i] == -1) {                    flag[i] = 0;                    pre[i] = v;                    change[i] = change[v] < Edge[v][i].c - Edge[v][i].f ? change[v] : Edge[v][i].c - Edge[v][i].f;                    que[rear ++] = i;                }            }            flag[v] = 1;        }        if(flag[M] == -1 || change[M] == 0) {            break;        }        int k1 = M, k2 = pre[M];        while(1) {            Edge[k2][k1].f += change[M];            Edge[k1][k2].f = - Edge[k2][k1].f;            if(k2 == 1) {                break;            }            k1 = k2, k2 = pre[k1];        }    }    int max_flow = 0;    for(int i = 1; i < M; ++ i) {        max_flow += Edge[i][M].f;    }    printf("%d\n", max_flow);}int main() {    freopen("poj1273.txt", "r", stdin);    int a, b, c;    while(scanf("%d%d", &N, &M) != EOF) {        for(int i = 1; i <= N; ++ i) {            for(int j = 1; j <= N; ++ j) {                Edge[i][j].c = Edge[i][j].f = 0;            }        }        while(N --) {            scanf("%d%d%d", &a, &b, &c);            Edge[a][b].c += c;        }        Ford();    }    return 0;}