Cod sursa(job #2289395)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 24 noiembrie 2018 15:30:48
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define NMAX 1001
#define MMAX 5001
#define mp make_pair

using namespace std;

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

int n, m, G[NMAX][NMAX], max_flow, flow;
bool viz[NMAX];
queue < pair <int, int> > q;
int mymap[NMAX];
bool BF()
{

    while(!q.empty())
        q.pop();
    q.push(mp(1, (1<<30)));
    viz[1] = 1;
    while(!q.empty())
    {
        int nod =  q.front().first;
        int capacity = q.front().second;
        q.pop();


        for(int i = 1; i <= n; i++)
            if(G[nod][i]>0 && !viz[i])
             {
                 q.push(mp(i, min(capacity, G[nod][i])));
                 viz[i] = 1;
                mymap[i] = nod;
                 if(i == n)
                 {
                     max_flow += min(capacity, G[nod][i]);
                     flow = min(capacity, G[nod][i]);
                     return 1;
                 }

             }
    }
    return 0;
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int a, b, c;
        fin >> a >> b >> c;
        G[a][b] = c;
    }
    bool ok = false;
    do{
        int nod = n;
        ok = false;
        memset(viz, 0, sizeof(viz));
        memset(mymap, 0, sizeof(mymap));
        ok = BF();
        if(ok)
        while(nod != 1)
        {
            int x = mymap[nod];
            G[x][nod] -= flow;
            G[nod][x] += flow;
            nod = x;
        }

    }while(ok);

    fout << max_flow;
    return 0;
}