Cod sursa(job #599771)

Utilizator nervousNervous nervous Data 29 iunie 2011 15:57:27
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <cstring>
#include <vector>

#define X1 1001
#define INF 0x7fffffff

using namespace std;

ifstream in;
ofstream out;

vector <int> v[X1];

int C[X1][X1],F[X1][X1];
int use[X1],T[X1],q[X1];
int N,ind;

inline void bf(int nod)
{
    for(vector <int>::iterator it=v[nod].begin();it!=v[nod].end();++it)
        if(!use[*it])
            if(C[nod][*it]>F[nod][*it])
            {
                use[*it]=1;
                T[*it]=nod;
                q[++q[0]]=*it;
            }

    if(ind<=q[0])
    {
        nod=q[ind++];
        if(nod!=N) bf(nod);
        else
        if(ind<=q[0])
        {
            nod=q[ind++];
            bf(nod);
        }
    }
}

int main()
{
    int M,x,y,flux=0,min;

    memset(C,0,sizeof(C));
    memset(F,0,sizeof(F));

    in.open("maxflow.in");
    in>>N>>M;
    for(;M;--M)
    {
        in>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
        in>>C[x][y];
    }
    in.close();

    while(1)
    {
        memset(T,0,sizeof(T));
        memset(use,0,sizeof(use));
        memset(q,0,sizeof(q));
        use[1]=1;
        ind=1;
        bf(1);
        if(!use[N]) break;
        for(vector <int>::iterator it=v[N].begin();it!=v[N].end();++it)
            if(C[*it][N]>F[*it][N]&&use[*it])
            {
                T[N]=*it;
                min=INF;
                x=N;
                while(x!=1)
                {
                    if(min>C[T[x]][x]-F[T[x]][x]) min=C[T[x]][x]-F[T[x]][x];
                    x=T[x];
                }

                if(min>0)
                {
                    x=N;
                    while(x!=1)
                    {
                        F[T[x]][x]+=min;
                        F[x][T[x]]-=min;
                        x=T[x];
                    }
                    flux+=min;
                }
            }
    }

    out.open("maxflow.out");
    out<<flux<<'\n';
    out.close();

    return 0;
}