Cod sursa(job #1938280)

Utilizator Burbon13Burbon13 Burbon13 Data 24 martie 2017 19:03:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>

using namespace std;

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

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

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();
    viz[1] = true;
    q.push(1);

    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])
            {
                viz[*it] = 1;
                tata[*it] = nod;
                q.push(*it);
            }
    }
    return viz[n];
}

void gasire_drum()
{
    while(bfs())
    {
        for(vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it)
        {
            if(not viz[*it] || flux[*it][n] == cap[*it][n])
                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];
            }

            if(minim == 0)
                continue;

            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();
    gasire_drum();
    printf("%d\n", total);
    return 0;
}