Cod sursa(job #1773347)

Utilizator FlowstaticBejan Irina Flowstatic Data 7 octombrie 2016 19:12:29
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define NMAX 1004
#define INF 0x3f3f3f3f
using namespace std;

FILE* fin = fopen("maxflow.in","r");
FILE* fout = fopen("maxflow.out","w");

int cap[NMAX][NMAX],fl[NMAX][NMAX],C[NMAX],viz[NMAX];
int TT[NMAX];

vector<int> G[NMAX];

int N,M;
int flux = 0;

int BFS();
void FluxMaxim();
void Citire();
void Afisare();


int main()
{
    Citire();
    FluxMaxim();
    Afisare();
}


void Citire()
{
    int i;
    int x,y,z;

    fscanf(fin, "%d %d",&N,&M);

    for (i = 1; i <= M; i++)
    {
        fscanf(fin,"%d %d %d", &x, &y, &z);
        cap[x][y] += z;
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

void FluxMaxim()
{
    int i,j,fmin;
    while(BFS()) //2.1 cauta lant de ameliorare
        for( i = 0; i < G[N].size(); i++) //2.2 amelioram fluxul
        {
            j = G[N][i];
            if(fl[j][N] == cap[j][N] || !viz[j]) continue;

            TT[N] = j;

            fmin = INF;
            for (j = N; j != 1; j = TT[j])
                fmin = min(fmin, cap[ TT[j] ][j] - fl[ TT[j] ][j]);

            //nu avem ce ameliora
            if (fmin == 0) continue;

            //amelioram
            for (j = N; j != 1; j = TT[j])
            {
                fl[ TT[j] ][j] += fmin;
                fl[j][ TT[j] ] -= fmin;
            }

            flux += fmin;
        }
}

int BFS() //MARCAJ FF
{
    int nod, i, j, vf;

    C[0] = 1;
    C[1] = 1;
    viz[1] = 1;

    memset(viz, 0, sizeof(viz));

    for( i = 1; i<= C[0]; i++)
    {
        nod = C[i];

        if (nod == N) continue;
        for (j = 0; j < G[nod].size(); j++)
        {
                vf = G[nod][j];
                //conditii: f(x,y) < c(x,y) cu x marcat si y nemarcat
                if (fl[nod][vf] == cap[nod][vf] || viz[vf]) continue;

                //marcam y cu +nod
                viz[vf] = 1;
                C[ ++C[0] ] = vf;
                TT[vf] = nod;
            }
    }
    return viz[N]; //daca e marcat f => am gasit lant de ameliorare
}


void Afisare()
{
    fprintf(fout,"%d\n",flux);
}