Cod sursa(job #905016)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 5 martie 2013 12:39:03
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstring>
#include <utility>
#include <fstream>
#include <queue>
#define oo int(2e9)
#define MAX 1010
#define mp make_pair

using namespace std;

bool viz[MAX];
int x, y, z, i, n, m, flow, cost, solFlow, from[MAX], D[MAX], cap[MAX][MAX];
priority_queue < pair<int, int> > Q;

bool Dijkstra()
{
    while(!Q.empty()) Q.pop();
    memset(from, 0, sizeof(from));
    memset(viz, 0, sizeof(viz));
    Q.push(mp(oo, 1));
    for(i = 1; i <= n; i++) D[i] = oo;
    D[1] = 0;
    while(!Q.empty())
    {
        x = Q.top().second;
        cost = Q.top().first;
        Q.pop();
        if(viz[x]) continue; else viz[x] = 1;
        for(i = 1; i <= n; i++)
            if(cap[x][i] and viz[i] == 0 and D[i] > min(cost, cap[x][i]))
            {
                D[i] = min(cost, cap[x][i]);
                from[i] = x;
                Q.push(mp(D[i], i));
            }
    }
    return D[n] != oo;
}
int main()
{
    ifstream fi("maxflow.in");
    ofstream fo("maxflow.out");
    fi >> n >> m;
    for(i = 1; i <= m; i++)
    {
        fi >> x >> y >> z;
        cap[x][y] = z;
        cap[y][x] = 0;
    }
    while(Dijkstra())
    {
        flow = int(2e9);
        for(i = n; from[i] != 0; i = from[i])
            flow = min(flow, cap[from[i]][i]);
        for(i = n; from[i] != 0; i = from[i])
            cap[from[i]][i] -= flow, cap[i][from[i]] += flow;
        solFlow += flow;
    }
    fo << solFlow << "\n";
    return 0;
}