Cod sursa(job #1905672)

Utilizator jason2013Andronache Riccardo jason2013 Data 6 martie 2017 10:10:20
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<bits/stdc++.h>
#define oo 0x3f3f3f3f

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()
{
    memset(visited, false, sizeof(visited));
    while(!Q.empty()) Q.pop();

    int start_point = 1;
    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 ford_fulkerson()
{
    int u, v, max_flow = 0;
    int s, t;
    t = N; s = 1;
    while(bfs())
    {
        int path_flow = INT_MAX;
        for(v = t; v != s; v = parent[v])
        {
            u = parent[v];
            path_flow = min(path_flow, mat[u][v]);
        }

        for(v = t; v != s; v = parent[v])
        {
            u = parent[v];
            mat[u][v] -= path_flow;
            mat[v][u] += path_flow;
        }
        max_flow += path_flow;
    }
    return max_flow;
}

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