Cod sursa(job #1827049)

Utilizator CalarisPredut Denis Stefanita Calaris Data 11 decembrie 2016 13:29:43
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>

int N,M,maxFlow = 0,minFlow;
const int MAX = 1001;
const int INF = 0x3f3f3f3f;

std::fstream f("maxflow.in",std::ios::in);
std::ofstream g("maxflow.out");

std::vector<int> G[MAX];
std::vector<int>::iterator it;
int Cost[MAX][MAX],Q[MAX],Flow[MAX][MAX],path[MAX];
bool viz[MAX];

int BFS();
void citire();
void rezolvare();

int min(int a, int b)
{
    return (a>b)?b:a;
}

int main()
{
    f>>N>>M;
    citire();
    rezolvare();

    g<<maxFlow;
    return 0;
}

void citire()
{
   int i,x,y,l;
   for(i=1;i<=M;++i)
    {
    f>>x>>y>>l;
    Cost[x][y]+=l;
    G[x].push_back(y);
    G[y].push_back(x);
    }
}

void rezolvare()
{
   int nod;
    while(BFS())
        {
        for(it = G[N].begin();it!=G[N].end();++it)
            {
             nod = *it;
             if(Cost[nod][N]>Flow[nod][N] && viz[N])
                {
                path[N] = nod;
                minFlow = INF;
                for(nod = N; nod!=1;nod = path[nod])
                    {
                    minFlow = min(minFlow,Cost[path[nod]][nod]-Flow[path[nod]][nod]);
                    }
                if(minFlow == 0)continue;

                for(nod = N;nod!=1;nod = path[nod])
                    {
                     Flow[path[nod]][nod] += minFlow;
                     Flow[nod][path[nod]] -= minFlow;
                    }
                maxFlow+=minFlow;
                }
            }
        }
}

int BFS()
{
   int i,nod;

   viz[1] = 1;
   Q[0] = 1;
   Q[1] = 1;

   for(i=1;i<=N;++i)viz[i] = 0;

   for(i=1;i<=Q[0];++i)
    {
      if(Q[i]==N)continue;
      nod = Q[i];

      for(it = G[nod].begin();it != G[nod].end();++it)
        {
        if(Cost[nod][*it]>Flow[nod][*it] && !viz[*it])
            {
            viz[*it] = 1;
            path[*it] = nod;
            Q[++Q[0]] = *it;
            }
        }
    }

    return viz[N];
}