Cod sursa(job #606076)

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

queue <int> Q;
vector <int> A[1010];
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] = 1;
    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 <= m; ++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 (F[*it][n] < C[*it][n] && dm[*it])
            {
                int minflow = C[*it][n] - F[*it][n];
                for (int i = *it; i > 1; i = dm[i])
                    minflow = min (minflow, C[dm[i]][i] - F[dm[i]][i]);
                F[*it][n] += minflow, F[n][*it] -= minflow;
                for (int i = *it; i > 1; i = dm[i])
                    F[dm[i]][i] += minflow, F[i][dm[i]] -= minflow;
                flux += minflow;
            }
    g << flux;
    g.close ();
    return 0;
}