Cod sursa(job #1832361)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 19 decembrie 2016 20:42:21
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <utility>
#include <algorithm>
#include <cstring>

#define MAXN 1024
#define INF 2000000000

int n, m;
std::vector < int > G[1 + MAXN];
int C[1 + MAXN][1 + MAXN];
int F[1 + MAXN][1 + MAXN];
int q[1 + MAXN];
int father[1 + MAXN];
int viz[1 + MAXN];

int bfs(){
    q[0] = 1;
    q[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;

    for(int i = 1; i <= q[0]; i++){
        int node = q[i];
        if(node != n)
            for(int j = 0; j < G[node].size(); j++){
                int vecin = G[node][j];
                if(!viz[vecin] && C[node][vecin] != F[node][vecin]){
                    viz[vecin] = 1;
                    q[++q[0]] = vecin;
                    father[vecin] = node;
                }
            }
    }

    return viz[n];
}

inline int minim(int a, int b){
    return a < b ? a : b;
}

int main(){
    fi = fopen("maxflow.in","r");
    fo = fopen("maxflow.out","w");

    fscanf(fi,"%d%d", &n, &m);
    for(int i = 0; i <= m; i++){
        int x, y, z;
        fscanf(fi,"%d%d%d", &x, &y, &z);
        C[x][y] += z;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    int flow = 0;
    while(bfs())
        for(int i = 0; i < G[n].size(); i++){
            int node = G[n][i];
            if(viz[node] && C[node][n] != F[node][n]){
                father[n] = node;

                int fmin = INF;
                for(int node = n; node != 1; node = father[node])
                    fmin = minim(fmin, C[father[node]][node] - F[father[node]][node]);
                if(fmin != 0){
                    for(int node = n; node != 1; node = father[node]){
                        F[father[node]][node] += fmin;
                        F[node][father[node]] -= fmin;
                    }
                    flow += fmin;
                }
            }
        }

    fprintf(fo,"%d", flow);
    fclose(fi);
    fclose(fo);
    return 0;
}