Cod sursa(job #599663)

Utilizator nervousNervous nervous Data 29 iunie 2011 12:41:54
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cstring>
#include <vector>

#define X1 1001

using namespace std;

ifstream in;
ofstream out;

vector <int> v[X1];

int C[X1][X1];
int use[X1],T[X1],q[X1];
int N,drum=0,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]>0)
            {
                use[*it]=1;
                T[*it]=nod;
                if(*it==N)
                {
                    drum=1;
                    return;
                }
                q[++q[0]]=*it;
            }

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

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

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

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

    while(!drum)
    {
        memset(T,0,sizeof(T));
        memset(use,0,sizeof(use));
        memset(q,0,sizeof(q));
        use[1]=1;
        ind=1;
        bf(1);
        if(!drum) break;
        min=-1;
        x=N;
        while(x!=1)
        {
            if(min==-1||C[T[x]][x]<min) min=C[T[x]][x];
            x=T[x];
        }
        x=N;
        while(x!=1)
        {
            C[T[x]][x]-=min;
            x=T[x];
        }
        flux+=min;
        drum=0;
    }

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

    return 0;
}