Cod sursa(job #1913017)

Utilizator Burbon13Burbon13 Burbon13 Data 8 martie 2017 11:31:39
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>

using namespace std;

const int nmx = 1002;
const int inf = 0x3f3f3f3f;

int n,m,cap[nmx][nmx],flux[nmx][nmx],tata[nmx],total;
vector <int> g[nmx];
queue <int> q;
bitset <nmx> viz;

void citire()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; ++i)
    {
        int nod1,nod2;
        scanf("%d %d", &nod1, &nod2);
        scanf("%d", &cap[nod1][nod2]);
        g[nod1].push_back(nod2);
        g[nod2].push_back(nod1);
    }
}

bool bfs()
{
    viz.reset();
    q.push(1);
    viz[1] = true;
    while(not q.empty())
    {
        int nod = q.front();
        q.pop();

        if(nod == n)
            continue;

        for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
            if(not viz[*it] && cap[nod][*it] != flux[nod][*it])
            {
                tata[*it] = nod;
                viz[*it] = true;
                q.push(*it);
            }
    }
    return viz[n];
}

void cautare()
{
    while(bfs())
    {
        for(vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it)
        {
            if(cap[*it][n] == flux[*it][n] || not viz[*it])
                continue;
            tata[n] = *it;
            int nod = n, minim = inf;
            while(nod > 1)
            {
                minim = min(minim,cap[tata[nod]][nod] - flux[tata[nod]][nod]);
                nod = tata[nod];
            }
            total += minim;
            nod = n;
            while(nod > 1)
            {
                flux[tata[nod]][nod] += minim;
                flux[nod][tata[nod]] -= minim;
                nod = tata[nod];
            }
        }
    }
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    citire();
    cautare();
    printf("%d\n", total);
    return 0;
}