Cod sursa(job #905058)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 5 martie 2013 15:00:45
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstring>
#include <vector>
#include <fstream>
#include <queue>
#define MAX 1010

using namespace std;

vector<int> G[MAX];
int x, y, z, i, n, m, flow, solFlow, f[MAX][MAX], from[MAX], cap[MAX][MAX];
queue <int> Q;
bool viz[MAX];

bool BF()
{
    memset(viz, 0, sizeof(viz));
    from[1] = 0;
    viz[1] = 1;
    Q.push(1);
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        for(vector<int> :: iterator it = G[x].begin(); it != G[x].end(); ++it)
            if(f[x][*it] != cap[x][*it] and !viz[*it])
            {
                from[*it] = x;
                viz[*it] = 1;
                Q.push(*it);
            }
    }
    return viz[n];
}
int main()
{
    ifstream fi("maxflow.in");
    ofstream fo("maxflow.out");
    fi >> n >> m;
    for(i = 1; i <= m; i++)
    {
        fi >> x >> y >> z;
        G[x].push_back(y);
        G[y].push_back(x);
        cap[x][y] = z;
    }
    while(BF())
    {
        flow = int(2e9);
        for(i = n; i != 1; i = from[i])
            flow = min(flow, cap[from[i]][i] - f[from[i]][i]);
        for(i = n; i != 1; i = from[i])
            f[from[i]][i] += flow, f[i][from[i]] -= flow;
        solFlow += flow;
    }
    fo << solFlow << "\n";
    return 0;
}