Cod sursa(job #1960198)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 10 aprilie 2017 11:48:52
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;

const int INFINIT = 0x3f3f3f3f;
const int MAXN = 1005;

bool marcat[MAXN];
queue<int> coada;
vector<int> graf[MAXN];
int n, m, capacitate[MAXN][MAXN], flux[MAXN][MAXN], tata[MAXN];

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

int parcurgere()
{
    memset(marcat,0,MAXN);
    coada.push(1);
    marcat[1]=1;
    tata[1] = 1;
    while(!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        if(nod!=n)
        {
            for(int j=0;j<graf[nod].size();j++)
            {
                int vecin = graf[nod][j];
                if(!marcat[vecin] && capacitate[nod][vecin] != flux[nod][vecin])
                {
                    marcat[vecin] = 1;
                    tata[vecin] = nod;
                    coada.push(vecin);
                }
            }
        }
    }

    return marcat[n];
}

int Flux;

void citire()
{
    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int a, b, cp;
        in>>a>>b>>cp;
        capacitate[a][b] = cp;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
}

int main()
{
    for(citire(); parcurgere();)
    {
        int minim = INFINIT;
        for(int vecin : graf[n])
        {
            int i = vecin;
            while(tata[i] != i)
            {
                minim = min(minim,capacitate[tata[i]][i] - flux[tata[i]][i]);
                i = tata[i];
            }

            i = vecin;
            while(tata[i] != i)
            {
                flux[i][tata[i]] -= minim;
                flux[tata[i]][i] += minim;
                i = tata[i];
            }
            Flux += minim;
        }
        memset(tata,0,sizeof(tata));
    }

    out<<Flux;

    return 0;
}