Cod sursa(job #599618)

Utilizator nervousNervous nervous Data 29 iunie 2011 11:50:19
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cstring>
#include <queue>

#define X1 1001

using namespace std;

ifstream in;
ofstream out;

queue <int> q;

int G[X1][X1];
int use[X1],T[X1];
int N,drum=0;

inline void bf(int nod)
{
    for(int i=1;i<=N;i++)
        if(G[nod][i]>0)
            if(!use[i])
            {
                use[i]=1;
                T[i]=nod;
                if(i==N)
                {
                    drum=1;
                    return;
                }
                q.push(i);
            }

    if(!q.empty())
    {
        nod=q.front();
        q.pop();
        bf(nod);
    }
}

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

    memset(G,0,sizeof(G));

    in.open("maxflow.in");
    in>>N>>M;
    for(;M;--M)
    {
        in>>x>>y>>c;
        G[x][y]=c;

        while(!drum)
        {
            memset(T,0,sizeof(T));
            memset(use,0,sizeof(use));
            while(!q.empty()) q.pop();
            use[1]=1;
            bf(1);
            if(!drum) break;
            min=-1;
            x=N;
            while(x!=1)
            {
                if(min==-1||min>G[T[x]][x]) min=G[T[x]][x];
                x=T[x];
            }
            x=N;
            while(x!=1)
            {
                G[T[x]][x]-=min;
                x=T[x];
            }
            flux+=min;
            drum=0;
        }
    }
    in.close();

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

    return 0;
}