Cod sursa(job #606055)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 3 august 2011 12:01:24
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
# include <fstream>
# include <queue>
# include <vector>
using namespace std;

queue <int> Q;
vector <int> A[1000];
int n, m, F[1010][1010], C[1010][1010], dm[1010], x, y, z, flux;

inline int BFs ()
{
    Q.push (1);
    for (int i = 1; i <= n; ++i) dm[i] = 0;
    dm[1] = 0;
    for (; !Q.empty (); Q.pop ())
    {
        int ret = Q.front ();
        for (vector <int> :: iterator it = A[ret].begin (); it != A[ret].end (); ++it)
            if (F[ret][*it] < C[ret][*it] && dm[*it] == 0)
                dm[*it] = ret, Q.push (*it);
    }
    return dm[n];
}
int main ()
{
    ifstream f ("maxflow.in");
    ofstream g ("maxflow.out");
    f >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        f >> x >> y >> z;
        A[x].push_back (y);
        A[y].push_back (x);
        C[x][y] = z;
    }
    for (; BFs () > 0; )
    {
        for (vector <int> :: iterator it = A[n].begin (); it != A[n].end (); ++it)
        {
            if (!dm[n]) break ;
            if (F[*it][n] == C[*it][n]) continue ;
            int minflow = 0x3f3f3f3f;
            for (int i = *it; i > 1; i = dm[i])
                minflow = min (minflow, C[dm[i]][i] - F[dm[i]][i]);
            if (!minflow) continue ;

            for (int i = *it; i > 1; i = dm[i])
                F[i][dm[i]] -= minflow, F[dm[i]][i] += minflow;
            flux += minflow;
        }
    }
    g << flux;
    g.close ();
    return 0;
}