Cod sursa(job #799543)

Utilizator sebii_cSebastian Claici sebii_c Data 19 octombrie 2012 12:19:14
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include <cstring>

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

#define MAXN 1002
#define INF 200000

int n, m;
vector<int> G[MAXN];
int cap[MAXN][MAXN];
int viz[MAXN], from[MAXN];
int source = 1, dest;

int max_flow();
int find_path();
void read();

int max_flow()
{
    int flow = 0;
    while (true) {
        int path = find_path();
        if (path == 0)
            break;
        flow += path;
    }

    return flow;
}

int find_path()
{
    queue<int> q;
    memset(viz, 0, sizeof(viz));
    memset(from, -1, sizeof(from));
    q.push(1);
    viz[1] = 1;
    bool flag = true;
    while (!q.empty() && flag) {
        int where = q.front(); q.pop();
        for (size_t i = 0; i < G[where].size() && flag; ++i) {
            int next = G[where][i];
            if (!viz[next] && cap[where][next] > 0) {
                viz[next] = 1;
                from[next] = where;
                q.push(next);
                if (next == dest)
                    flag = false;
            }
        }
    }

    int where = dest, path_cap = INF;
    while (from[where] > -1) {
        int prev = from[where];
        path_cap = min(path_cap, cap[prev][where]);
        where = prev;
    }

    where = dest;
    while (from[where] > -1) {
        int prev = from[where];
        cap[prev][where] -= path_cap;
        cap[where][prev] += path_cap;
        where = prev;
    }

    if (path_cap == INF)
        return 0;
    return path_cap;
}

void read()
{
    FILE *fin = fopen("maxflow.in", "r");
    fscanf(fin, "%d %d", &n, &m);
    dest = n;
    for (int i = 0; i < m; ++i) {
        int x, y, cost;
        fscanf(fin, "%d %d %d", &x, &y, &cost);
        G[x].push_back(y);
        cap[x][y] = cost;
        cap[y][x] = -cost;
    }
    fclose(fin);
}

int main()
{
    read();
    FILE *fout = fopen("maxflow.out", "w");
    fprintf(fout, "%d\n", max_flow());
    fclose(fout);

    return 0;
}