Cod sursa(job #1946940)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 30 martie 2017 17:00:23
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 kb
#include <fstream>
#include <vector>
#include <map>
using namespace std;

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

int noduri, muchii, inceput, sf, in, t[1005], sfarsit, capac, minim, total;

map <string, int> cost;
vector <int> matrice[1005];

struct tine
{
    int val, last;
}pahar;
         vector <tine> coada;

int capacitate(int a, int b)
{
    string x = "";
    x += a;
    x += ".";
    x += b;
    return cost[x];
}

void adauga(int a, int b, int adaos)
{
    string x = "";
    x += a;
    x += ".";
    x += b;
    cost[x] += adaos;
}

void scade(int minim)
{
    int cine = in;
    while(coada[cine].last != -1)
    {
        adauga(coada[coada[cine].last].val, coada[cine].val, -minim);
        adauga(coada[cine].val, coada[coada[cine].last].val, minim);
        cine = coada[cine].last;
    }
}

void refa()
{
    int minim = 110000002;
    //cout << noduri << ' '; //matrice[coada[in].val][i].sfarsit
    minim = min(minim, capacitate(coada[in].val, noduri));

    int cine = in;
    while(coada[cine].last != -1)
    {
        minim = min(minim, capacitate(coada[coada[cine].last].val, coada[cine].val));
        //cout << coada[cine].val << ' ';
        cine = coada[cine].last;
    }
    //cout << coada[cine].val;
    //cout << "  -  " << minim;
    //cout << '\n';
    scade(minim);
    total += minim;

    for(int i=0; i <= noduri; i++)
    t[i] = 0;

    in = -1;
    sf = 0;
    coada.clear();
    pahar.last = -1;
    pahar.val = 1;
    coada.push_back(pahar);
}

int main()
{
    cin >> noduri >> muchii;
    for(int i=1; i <= muchii; i++)
    {
        cin >> inceput >> sfarsit >> capac;
        adauga(inceput, sfarsit, capac);
        matrice[inceput].push_back(sfarsit);
    }

    pahar.last = -1;
    pahar.val = 1;
    coada.push_back(pahar);
    in = 0;
    sf = 0;

    while(in <= sf)
    {
        for(int i=0; i < matrice[coada[in].val].size(); i++)
        {
            if(t[matrice[coada[in].val][i]] == 0 && capacitate(coada[in].val, matrice[coada[in].val][i]) > 0)
            {
                if(matrice[coada[in].val][i] == noduri)
                {
                    refa();
                    break;
                }
                else
                {
                    sf++;
                    pahar.val = matrice[coada[in].val][i];
                    pahar.last = in;
                    coada.push_back(pahar);
                    t[matrice[coada[in].val][i]] = 1;
                }
            }
        }
        in++;
    }
    cout << total;
}