Cod sursa(job #1117196)

Utilizator ionutz_cnnbIonutz cnnb ionutz_cnnb Data 23 februarie 2014 11:30:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
// Eu - O(N*M*M)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

#define Mx 1024
#define Inf 333333333

int cap[Mx][Mx], fl[Mx][Mx];
int viz[Mx], tat[Mx];
vector <int> Ad[Mx];
int N, M;

int BF()
{
    int i, j, v1, v2, q[Mx],lq;

    lq = 1; q[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    for (i = 1; i <= lq; i++)
    {
        v1 = q[i];
        if (v1 != N)
        {
	    for (j = 0; j < Ad[v1].size(); j++)
            {
                v2 = Ad[v1][j];
                if (cap[v1][v2] > fl[v1][v2] && !viz[v2])
                {
                   viz[v2] = 1;
                   q[ ++lq ] = v2;
                   tat[v2] = v1;
                }
            }
        }
    }

    return viz[N];
}
int main()
{
    ifstream fi("maxflow.in");
    ofstream fo("maxflow.out");
    int i, f=0, fmin, x, y, z, v;
    fi >> N >> M;
    for (i = 1; i <= M; i++)
    {
        fi >> x >> y >> z;
        cap[x][y] += z;
        Ad[x].push_back(y);
        Ad[y].push_back(x);
    }
    while (BF())
        for (i = 0; i < Ad[N].size(); i++)
        {
            v = Ad[N][i];
            if (fl[v][N] == cap[v][N] || !viz[v]) continue;
            tat[N] = v;
            fmin = Inf;
            for (v = N; v != 1; v = tat[v])
                fmin = min(fmin, cap[ tat[v] ][v] - fl[ tat[v] ][v]);
            // if (fmin != 0)  {
                for (v = N; v != 1; v = tat[v])
                {
                   fl[ tat[v] ][v] += fmin;
                   fl[v][ tat[v] ] -= fmin;
                }
                f += fmin;
            // }
        }

    fo << f << "\n";
    return 0;
}