Cod sursa(job #1158084)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 28 martie 2014 19:57:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 1005;
const int INF = (1<<30)-1;

int MAX_FLOW=0;
int n, m, C[MAXN][MAXN], F[MAXN][MAXN], TT[MAXN];
bool viz[MAXN];
vector<int> G[MAXN];

void read()
{
    ifstream fin("maxflow.in");
    fin>>n>>m;
    for (int i=1; i<=m; ++i)
    {
        int x,y,cap;
        fin>>x>>y>>cap;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]=cap;
    }
    fin.close();
}
void write()
{
    ofstream fout("maxflow.out");
    fout<<MAX_FLOW<<'\n';
    fout.close();
}

bool bfs()
{
    for (int i=1; i<=n; viz[i]=false, TT[i]=0, ++i);

    queue<int> q;

    q.push(1);  viz[1]=true;
    while (!q.empty())
    {
        int u=q.front();
        q.pop();
        if (u==n)
            continue;
        for (auto v : G[u])
        {
            if (viz[v] || F[u][v]==C[u][v])
                continue;
            viz[v]=true;
            TT[v]=u;
            q.push(v);
        }
    }
    return viz[n];
}

void ek()
{
    while (bfs())
    {
        for (auto nod: G[n])
        {
            //DACA NU E DIN DRUM
            if (F[nod][n]==C[nod][n] || !viz[nod])
                continue;
            TT[n]=nod;


            int u,increment=INF;
            for (u=n; u!=1; u=TT[u])
                increment=min(increment, C[TT[u]][u]-F[TT[u]][u]);

            if (increment==0)
                continue;

            for (u=n; u!=1; u=TT[u])
            {
                F[TT[u]][u]+=increment;
                F[u][TT[u]]-=increment;
            }
            MAX_FLOW+=increment;
        }
    }
}

int main()
{
    read();
    ek();
    write();
    return 0;
}