Cod sursa(job #1554726)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 21 decembrie 2015 17:33:27
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int NMax = 1005;
const int oo  = 1000000000;
int N,M,MaxFlow;
vector <int> G[NMax];
int C[NMax][NMax],F[NMax][NMax];
int Use[NMax],TT[NMax];
queue <int> Q;

void Read()
{
    fin>>N>>M;
    for(int i = 1; i<=M; ++i)
        {
            int x,y,c;
            fin>>x>>y>>c;
            G[x].push_back(y);
            C[x][y] = c;
            G[y].push_back(x);
        }
}

int BFS()
{
    memset(Use,0,sizeof(Use));
    memset(TT,0,sizeof(TT));
    Q.push(1);
    Use[1] = 1;
    while(!Q.empty())
        {
            int Nod = Q.front();Q.pop();
            if(Nod == N) continue;
            for(int i = 0; i < (int)G[Nod].size(); i++)
                {
                    int Vecin = G[Nod][i];
                    if(Use[Vecin] || C[Nod][Vecin]-F[Nod][Vecin] == 0)
                        continue;
                    Q.push(Vecin);
                    Use[Vecin] = 1;
                    TT[Vecin] = Nod;
                }
        }
    return Use[N];
}

void Solve()
{
    while(BFS())
    {
        for(int k = 0; k < (int)G[N].size(); ++k)
            {
                int Nod = G[N][k];

                TT[N] = Nod;

                int Flow=oo;

                for(int i = N; i > 1; i = TT[i])
                    Flow = min(Flow,C[TT[i]][i]-F[TT[i]][i]);

                MaxFlow += Flow;

                for(int i = N; i > 1; i = TT[i])
                {
                    F[TT[i]][i] += Flow;
                    F[i][TT[i]] -= Flow;
                }
            }
    }
}

void Print()
{
    fout<<MaxFlow<<"\n";
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}