Cod sursa(job #2290673)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 26 noiembrie 2018 20:17:40
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 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],f[NMAX][NMAX], max_flow, flow;
bool viz[NMAX];
queue < int > q;
vector <int> v[NMAX];
int mymap[NMAX];
bool BF()
{
    while(!q.empty())
        q.pop();

    for(int i = 0; i <= n; i++)
        viz[i] = 0;

   // memset(mymap, 0, sizeof(mymap));

    q.push(1);
    viz[1] = 1;
    while(!q.empty())
    {
        int nod =  q.front();

        q.pop();

            if(nod == n)
                continue;
        for(int i = 0; i < v[nod].size(); i++)
        {
            int next = v[nod][i];

            if(G[nod][next]!=f[nod][next] && !viz[next])
             {
                 q.push(next);
                 viz[next] = 1;
                mymap[next] = nod;


             }
        }
    }
    return viz[n];
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int a, b, c;
        fin >> a >> b >> c;
        G[a][b] = c;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    bool ok = false;
    while(BF())
    {


        for(int i = 0; i < v[n].size(); i++)
        {
            int nod = v[n][i];

            if(G[nod][n] == f[nod][n] || viz[nod]==0) continue;
            mymap[n] = nod;

            int add = (1<<30);

            for(int nod = n; nod != 1; nod = mymap[nod])
                add = min(add, G[mymap[nod]][nod] - f[mymap[nod]][nod]);



            nod = n;
            for(int nod = n; nod != 1; nod = mymap[nod])
             {
                 f[mymap[nod]][nod] += add;
                 f[nod][mymap[nod]] -= add;
             }




            max_flow += add;

        }

    }

    fout << max_flow;
    return 0;
}