Cod sursa(job #1437757)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 18 mai 2015 16:20:32
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;

#define pb push_back
#define iterator vector<int>::iterator

const int NMAX = 1024;
const int INF = 1 << 30;
const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";

int capacitate[NMAX][NMAX];
int flux[NMAX][NMAX];
int tata[NMAX];
int viz[NMAX];
vector<int> graf[NMAX];
int n, m;

bool BF()
{
    int sursa = 1, dest = n, q[NMAX];
    memset(tata, 0, (n+5)*sizeof(int));
    memset(viz, 0, (n+5)*sizeof(int));
    q[0] = 1;
    q[1] = 1;
    viz[sursa] = 1;
    for(int j = 1; j <= q[0]; j++)
    {
        int nod = q[j];
        for(iterator it = graf[nod].begin(); it != graf[nod].end(); ++it)
        {
            if(!viz[*it] && flux[nod][*it] < capacitate[nod][*it])
            {
                viz[*it] = 1;
                tata[*it] = nod;
                q[ ++q[0] ] = *it;
                if(*it == dest)
                    return 1;
            }
        }
    }
    return 0;
}

int main()
{
    ifstream f(iname);
    f >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int x, y, z;
        f >> x >> y >> z;
        capacitate[x][y] += z;
        graf[x].pb(y);
        graf[y].pb(x);
    }
    while(BF())
    {
        int fmin = INF;
        for(int y = n; tata[y]; y = tata[y])
            if(capacitate[tata[y]][y] - flux[tata[y]][y] < fmin)
                fmin = capacitate[tata[y]][y] - flux[tata[y]][y];
        for(int y = n; tata[y]; y = tata[y])
        {
            flux[tata[y]][y] += fmin;
            flux[y][tata[y]] -= fmin;
        }
    }
    int fluxMax = 0;
    for(iterator it = graf[1].begin(); it != graf[1].end(); ++it)
        fluxMax += flux[1][*it];
    ofstream g(oname);
    g << fluxMax;
    return 0;
}