Cod sursa(job #2017716)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 2 septembrie 2017 09:17:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <bits/stdc++.h>
using namespace std;

FILE *f1 = fopen("maxflow.in", "r");
FILE *f2 = fopen("maxflow.out", "w");

int capacity[1001][1001], flow[1001][1001], n, m, mflow, v[1001], i, a, b, nr, coada[1001], mins, father[1001];
vector<int>G[1001];

int Edmonds_Karp()
{
    memset(v, 0, sizeof(v));

    nr = 0;
    mins = 1000000000;

    int p, u, i, sw = 1, j;
    p = u = 1;
    coada[p] = 1;
    v[1] = 1;
    while (p <= u)
    {
        nr = coada[p];
        for (i = 0; i < G[nr].size(); i++)
            if (v[G[nr][i]] == 0 && capacity[nr][G[nr][i]] - flow[nr][G[nr][i]] > 0)
            {
                v[G[nr][i]] = 1;
                father[G[nr][i]] = nr;

                if (G[nr][i] != n)
                {
                    u++;
                    coada[u] = G[nr][i];
                }
            }
        p++;
    }

    if (v[n] == 0)
        return 0;

    for (j = 0; j < G[n].size(); j++)
        if (v[G[n][j]] == 1 && capacity[G[n][j]][n] - flow[G[n][j]][n] > 0)
        {
            father[n] = G[n][j];
            mins = 1000000000;
            i = n;
            while (i != 1)
            {
                sw = father[i];
                if (mins > capacity[sw][i] - flow[sw][i])
                    mins = capacity[sw][i] - flow[sw][i];
                i = sw;
            }

            mflow = mflow + mins;

            i = n;
            while (i != 1)
            {
                sw = father[i];
                flow[sw][i] += mins;
                flow[i][sw] = -flow[sw][i];
                i = sw;
            }
        }

    return 1;
}

int main()
{
    fscanf(f1, "%d%d", &n, &m);
    for (i = 1; i <= m; i++)
    {
        fscanf(f1, "%d%d%d", &a, &b, &nr);
        capacity[a][b] = nr;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    a = 1;
    while(a == 1)
    {
        a = Edmonds_Karp();
    }

    fprintf(f2, "%d\n", mflow);

    return 0;
}