Cod sursa(job #1905657)

Utilizator jason2013Andronache Riccardo jason2013 Data 6 martie 2017 10:05:10
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<bits/stdc++.h>
using namespace std;

FILE *in = fopen("maxflow.in", "r");
FILE *out = fopen("maxflow.out", "w");

const int NMAX = 1e3 + 5;

queue<int>Q;

int mat[NMAX][NMAX], N, M, parent[NMAX];
bool visited[NMAX];

void read()
{
    fscanf(in, "%d%d", &N, &M);
    for(int i = 1; i <= M; i ++)
    {
        int x, y, z;
        fscanf(in, "%d%d%d", &x, &y, &z);
        mat[x][y] = z;
    }
}

void initialize()
{
    int start_point = 1;
    memset(visited, false, sizeof(visited));

    Q.push(start_point);
    visited[start_point] = true;
    parent[start_point] = -1;
}

bool bfs()
{
    initialize();
    while(!Q.empty())
    {
        int node = Q.front();
        Q.pop();
        for(int v = 1; v <= N; v++){
            if( !visited[v] && mat[node][v] > 0 )
            {
                visited[v] = true;
                parent[v] = node;
                Q.push(v);
            }
        }
    }
    return (visited[N] == true);
}

int edmondKarp()
{
    int maxFlow, flow;
    int s, t;
    s = 1; t = N;
    maxFlow = 0;

    while(bfs())
    {
        int Min = 0x3f3f3f3f;
        for(int v = t; v != s; v = parent[v])
        {
            int u = parent[v];
            flow = min( flow, mat[u][v] );
        }

        maxFlow += flow;

        for(int v = t; v != s; v = parent[v])
        {
            int u = parent[v];
            mat[u][v] -= flow;
            mat[v][u] += flow;
        }
    }
    return maxFlow;
}

int main()
{
    read();
    fprintf(out, "%d", edmondKarp());
    return 0;
}