Cod sursa(job #1164817)

Utilizator IonSebastianIon Sebastian IonSebastian Data 2 aprilie 2014 12:25:13
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <queue>
#include <cstring>
#include <vector>

using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

const int MAX_N = 1000, INF = 2000000000;

int f[MAX_N+1][MAX_N+1], pred[MAX_N+1], c[MAX_N+1][MAX_N+1];
int n, m;

bool viz[MAX_N+1];

queue<int> q;

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

bool bfs()
{
    int i, s;
    memset(viz+1, false, n);
    q.push(1);
    viz[1] = true;
    while(!q.empty())
    {
        s = q.front();
        q.pop();
        if(s != n)
        {
            for(i = 1; i <= n ; i++)
            {
                if(!viz[i] && f[s][i] < c[s][i])
                {
                    viz[i] = true;
                    q.push(i);
                    pred[i] = s;
                }
            }
        } else {
            while(!q.empty())
            {
                q.pop();
            }
            return true;
        }
    }
    return viz[n];
}

int minim()
{
    int m = INF, x = n;
    while(x != 1)
    {
        m = min2(m, c[pred[x]][x]-f[pred[x]][x]);
        x = pred[x];
    }
    return m;
}

void drum(int val)
{
    int x = n;
    while(x != 1)
    {
        f[pred[x]][x] += val;
        f[x][pred[x]] -= val;
        x = pred[x];
    }
}

int main()
{
    int a, b, i, sflux = 0;
    in >> n >> m;
    for(i = 1; i <= m; i++)
    {
        in >> a;
        in >> b;
        in >> c[a][b];
        c[b][a] = -c[a][b];
    }
    while(bfs())
    {
        m = minim();
        drum(m);
    }
    for(i = 1; i <= n; i++)
    {
        if(c[i][n] > 0)
        {
            sflux += f[i][n];
        }
    }
    out << sflux;
    return 0;
}