Cod sursa(job #2025182)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 21 septembrie 2017 23:52:20
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <queue>
#define VAL 1005
#define INF 1000000000

using namespace std;

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

int N, M, i, j, ANS, a, b;
int graph[VAL][VAL], c, X;
int prec[VAL], p;
bool viz[VAL];
queue <int> Q;

bool BFS()
{
    for (j=1; j<=N; j++)
      viz[j]=false;
    viz[1]=true;
    Q.push(1);
    while (Q.empty()==false)
    {
        p=Q.front();
        Q.pop();
        for (j=1; j<=N; j++)
        {
            if (viz[j]==false && graph[p][j]>0)
            {
                viz[j]=true;
                prec[j]=p;
                Q.push(j);
            }
        }
    }
    return viz[N]==true;
}

void Ford_Fulkerson()
{
    while (BFS()==true)
    {
        X=INF;
        for (i=N; i!=1; i=prec[i])
        {
            p=prec[i];
            X=min(X, graph[p][i]);
        }
        for (i=N; i!=1; i=prec[i])
        {
            p=prec[i];
            graph[p][i]-=X;
            graph[i][p]+=X;
        }
        ANS+=X;
    }
}

int main()
{
    fin >> N >> M;
    for (i=1; i<=M; i++)
    {
        fin >> a >> b >> c;
        graph[a][b]=c;
    }
    Ford_Fulkerson();
    fout << ANS << '\n';
    fin.close();
    fout.close();
    return 0;
}