Cod sursa(job #2410209)

Utilizator eduardcadarCadar Eduard eduardcadar Data 19 aprilie 2019 20:05:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
#define nmax 1003
int n, m, A[nmax][nmax], t[nmax], sursa, dest;
bool u[nmax];
vector<int> v[nmax];
int bfs() {
    memset(t, -1, sizeof(t));
    memset(u, 0, sizeof(u));
    int Q[n], p = 0, q = 0;
    Q[0] = sursa;
    u[sursa] = 1;
    while (p <= q) {
        int nod = Q[p++];
        for (int i = 0; i < v[nod].size(); ++i)
            if (!u[v[nod][i]] && A[nod][v[nod][i]] > 0) {
                t[v[nod][i]] = nod;
                Q[++q] = v[nod][i];
                u[v[nod][i]] = 1;
        }
    }
    if (t[dest] + 1) return 1;
    return 0;
}
int main()
{
    f >> n >> m;
    int x, y, c;
    for (int i = 1; i <= m; ++i) {
        f >> x >> y >> c;
        A[x][y] = c;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    int f = 0;
    sursa = 1, dest = n;
    while (bfs()) {
        for (int i = 1; i < dest; ++i) {
            if (t[i] + 1 && A[i][dest] > 0) {
                int mini = INT_MAX;
                mini = min(mini, A[i][dest]);
                for (int j = i; j != sursa; j = t[j]) mini = min(mini, A[t[j]][j]);
                if (mini < 0) continue;
                A[i][dest] -= mini;
                for (int j = i; j != sursa; j = t[j]) A[t[j]][j] -= mini, A[j][t[j]] += mini;
                f += mini;
            }
        }
    }
    g << f << '\n';
    return 0;
}