Cod sursa(job #1842114)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 6 ianuarie 2017 15:26:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 1000
#define MMAX 5000
const int INF = 0x7fffffff;
int N,M,flux=0, fluxminim, nod;
int c[NMAX+1][NMAX+1];
int f[NMAX+1][NMAX+1];
int tata[NMAX+1];
char vizitat[NMAX+1];
vector <int> muchie[NMAX+1];
FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");
int minim(int a, int b)
{
    if(a<b) return a;
    return b;
}
int bfs()
{
    for(int i=1;i<=N;i++)
    {
        vizitat[i]=0;
    }
    queue <int> frontiera;
    frontiera.push(1);
    vizitat[1]=1;
    while(!frontiera.empty())
    {
        int nod = frontiera.front();
        frontiera.pop();
        if(nod == N) continue;
        for(auto m : muchie[nod])
        {
            if(c[nod][m] == f[nod][m] || vizitat[m]==1) continue;
            tata[m] = nod;
            vizitat[m] = 1;
            frontiera.push(m);
        }
    }
    return vizitat[N];
}
int main()
{
    fscanf(fin, "%d%d", &N, &M);
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        fscanf(fin , "%d%d%d", &x, &y, &z);
        c[x][y]=z;
        muchie[x].push_back(y);
        muchie[y].push_back(x);
    }
    while(bfs())
    {
        for(auto m : muchie[N])
        {
            if(c[m][N] == f[m][N] || vizitat[m]==0 ) continue;
            tata[N] = m;
            fluxminim = INF;
            nod = N;
            while(nod != 1)
            {
                fluxminim = minim(fluxminim , c[tata[nod]][nod]-f[tata[nod]][nod]);
                nod = tata[nod];
            }
            if(fluxminim == 0) continue;
            nod = N;
            while(nod!=1)
            {
                f[tata[nod]][nod] += fluxminim;
                f[nod][tata[nod]] -= fluxminim;
                nod = tata[nod];
            }
            flux += fluxminim;
        }
    }
    fprintf(fout, "%d", flux);
    return 0;
}