Cod sursa(job #578784)

Utilizator chibicitiberiuChibici Tiberiu chibicitiberiu Data 11 aprilie 2011 16:42:07
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <stdio.h>
#include <queue>
#include <string.h>
#include <stdlib.h>


#define LIMIT 100
#define DEBUG 0
using namespace std;

int Cap[LIMIT][LIMIT];
int Flux[LIMIT][LIMIT];
int Vizited[LIMIT];
int NrVf;

int Enter, Exit;

int BFS()
{
    queue<int> Q;
    Q.push(Enter);
    Vizited[Enter] = 1;

    while (!Q.empty())
    {
        int x = Q.front(); Q.pop();
        
        for (int i=1; i<=NrVf; i++)
            if (!Vizited[i]){
                if (Flux[x][i] < Cap[x][i]) { Vizited[i] = x; Q.push(i); }
                else if (Flux[i][x]) { Vizited[i] = -x; Q.push(i); }
            }
    }
    
    return (!Vizited[Exit]);

}


void edm_karp()
{
    int Lant[LIMIT];
    int a,b,lg,v;

    do {
        memset(Vizited, 0, sizeof(int) * (NrVf+2));
        if (BFS()) return;

        Lant[0] = Exit; lg = 0; a = b = 0x7fffffff;

        while (Lant[lg] != Enter)
        {
            ++lg;
            Lant[lg] = abs(Vizited[Lant[lg-1]]);
            if (Vizited[Lant[lg-1]] > 0)
                a = min(a, Cap[Lant[lg]][Lant[lg-1]] - Flux[Lant[lg]][Lant[lg-1]]);
            else if (Vizited[Lant[lg-1]] < 0)
                b = min(b, Flux[Lant[lg-1]][Lant[lg]]);
        }

        v = min (a,b);

        for (int i=lg; i > 0; i--)
            if (Vizited[Lant[i-1]] > 0) Flux[Lant[i]][Lant[i-1]] += v;
            else Flux[Lant[i-1]][Lant[i]] -= v;

    } while (1);

}


int main()
{
    freopen("maxflow.in", "r", stdin);

#if DEBUG == 0
    freopen("maxflow.out", "w", stdout);
#endif

    int M;
    scanf("%d %d\n", &NrVf, &M);

    for (int x,y,c; M > 0; M--)
    {
        scanf ("%d %d %d\n", &x, &y, &c);
        Cap[x][y] = c;
    }

    Enter = 1; Exit = NrVf;

    edm_karp();

    int vf = 0;
    for (int i=1; i<=NrVf; i++, vf+=Flux[i][Exit])
#if DEBUG == 1
        for (int j=1; j<=NrVf; j++)
            if (Flux[i][j]) printf("Fluxul arcului (%d,%d) = %d\n", i, j, Flux[i][j]);
#else
        ;
#endif
    printf ("%d\n", vf);

    return 0;
}