Cod sursa(job #1641235)

Utilizator mateidanutDanut Gabriel Matei mateidanut Data 8 martie 2016 21:54:16
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1001
#define inf 2000000000
using namespace std;

int U[NMAX], F[NMAX][NMAX], C[NMAX][NMAX], T[NMAX], n, m;
queue<int> Q;
vector<int> G[NMAX];

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int BFS()
{   Q.push(1);
    int i, ok=0;
    for (i=1; i<=n; ++i)
        U[i]=0;
    while (!Q.empty())
    {   int nod=Q.front(), k;
        Q.pop();
        for (i=0; i<G[nod].size(); ++i)
        {   k=G[nod][i];
            if (k!=n && !U[k] && C[nod][k]!=F[nod][k])
            {   Q.push(k);
                U[k]=1;
                T[k]=nod;
                ok=1;
            }
        }
    }
    return ok;
}


int main()
{   int i, nod, mini, cap, x, y;
    f>>n>>m;
    for (; m; --m)
    {   f>>x>>y>>cap;
        C[x][y]=cap;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int flux;
    for (flux=0; BFS(); )
        for (i=0; i<G[n].size(); ++i)
        {   mini=inf;
            nod=G[n][i];
            while (T[nod])
            {   mini=min(mini, C[T[nod]][nod]-F[T[nod]][nod]);
                nod=T[nod];
            }
            flux+=mini;
            nod=G[n][i];
            while (T[nod])
            {   F[T[nod]][nod]+=mini;
                F[nod][T[nod]]-=mini;
                nod=T[nod];
            }
        }
    g<<flux;
    return 0;
}