Cod sursa(job #1938299)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 24 martie 2017 19:13:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int nmax = 1005;
int N,M,C[nmax][nmax],F[nmax][nmax],TT[nmax];
bool viz[nmax];
queue < int > Q;
vector < int > L[nmax];


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

inline bool BFS()
{
    int i,nod;
    for(i = 2; i <= N; i++) viz[i] = false;
    viz[1] = true; Q.push(1);
    while(!Q.empty())
    {
        nod = Q.front();
        Q.pop();
        if(nod == N) continue;
        for(auto it : L[nod])
            if(!viz[it] && F[nod][it] < C[nod][it])
        {
            viz[it] = true;
            TT[it] = nod;
            Q.push(it);
        }
    }
    return viz[N];
}


inline void Solve()
{
    int i,j,maxflow = 0,minflow;

    while(BFS())
    {
        for(auto it : L[N])
            if(viz[it])
            {
                minflow = C[it][N] - F[it][N];
                for(j = it; TT[j] != 0; j = TT[j])
                    minflow = min(minflow,C[TT[j]][j] - F[TT[j]][j]);
                if(!minflow) continue;
                F[it][N] += minflow; F[N][it] -= minflow;
                for(j = it; TT[j] != 0; j = TT[j])
                {
                    F[TT[j]][j] += minflow;
                    F[j][TT[j]] -= minflow;
                }
                maxflow += minflow;
            }
    }


    fout << maxflow << "\n";
    fout.close();
}


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