Cod sursa(job #897207)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 27 februarie 2013 19:22:47
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
#define Nmax 1009

using namespace std;

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

int FLUX,maxf,n,nod,nod2,x,y,c,m,i;
int C[Nmax][Nmax],F[Nmax][Nmax],ok[Nmax],T[Nmax];
vector<int> a[Nmax];
vector<int>::iterator it;
queue<int> Q;

int BF()
{
    Q.push(1);
    memset(ok,0,sizeof(ok));

    while (!Q.empty())
    {
        nod=Q.front();
        Q.pop();
        for (it=a[nod].begin();it!=a[nod].end();it++)
        {
            nod2=*it;
            if (!ok[nod2] && (F[nod][nod2] < C[nod][nod2]))
            {
                T[nod2]=nod;
                ok[nod2]=1;

                if (nod2==n) continue;
                Q.push(nod2);
            }
        }
    }
    return ok[n];
}

int main()
{
    in>>n>>m;
    for (i=1;i<=m;i++)
    {
        in>>x>>y>>c;
        a[x].pb(y);
        a[y].pb(x);
        C[x][y]=c;
    }

    while (BF())
        for (it=a[n].begin();it!=a[n].end();it++)
        {
            nod=*it;
            maxf=C[nod][n]-F[nod][n];

            while (nod!=1 && maxf)
            {
                maxf=min(maxf,C[T[nod]][nod]-F[T[nod]][nod]);
                nod=T[nod];
            }

            if (!maxf) continue;

            nod=*it;
            F[nod][n]+=maxf;
            F[n][nod]-=maxf;

            while (nod!=1)
            {
                F[T[nod]][nod]+=maxf;
                F[nod][T[nod]]-=maxf;

                nod=T[nod];
            }
            FLUX+=maxf;
        }
    out<<FLUX;
}