Cod sursa(job #2120345)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 2 februarie 2018 12:51:14
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <vector>
using namespace std;

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

int in, sf, nod, q, vecin, t[1004], ramas[1004][1004], noduri, muchii, a, b, c;
int poz, total, urm, flow;

struct Coada
{
    int nod, flow, prev;
}coada[100004];
vector <int> lista[1004];

int bfs()
{
    in = 1;
    sf = 1;
    coada[1].nod = 1;
    coada[1].flow = 551000000;
    while(in <= sf)
    {
        nod = coada[in].nod;
        q = lista[nod].size();
        for(int i=0; i < q; i++)
        {
            vecin = lista[nod][i];
            if(t[vecin] == 0 && ramas[nod][vecin] != 0)
            {
                t[vecin] = 1;
                sf++;
                coada[sf].nod = vecin;
                coada[sf].flow = min(coada[in].flow, ramas[nod][vecin]);
                coada[sf].prev = in;
                if(coada[sf].nod == noduri)
                return sf;
            }
        }
        in++;
    }
    return -1;
}

int main()
{
    cin >> noduri >> muchii;
    for(int i=1; i <= muchii; i++)
    {
        cin >> a >> b >> c;
        lista[a].push_back(b);
        lista[b].push_back(a);
        ramas[a][b] = c;
    }

    while(bfs() != -1)
    {
        poz = sf;
        total += coada[poz].flow;
        flow = coada[poz].flow;
        while(coada[poz].prev != 0)
        {
            nod = coada[coada[poz].prev].nod;
            urm = coada[poz].nod;
            ramas[nod][urm] -= flow;
            ramas[urm][nod] += flow;
            poz = coada[poz].prev;
        }
        for(int i=1; i <= sf; i++)
        t[coada[i].nod] = 0;
    }
    cout << total;
}