Cod sursa(job #1954779)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 5 aprilie 2017 17:23:14
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>

#define mp make_pair
#define pb push_back

using namespace std;

const int NMax = 1005;
const int MMax = 5005;

int N, M;
int flux[NMax][NMax];
int capa[NMax][NMax];

queue < pair < int, int > > Q;
vector < int > G[NMax];

void Read()
{
    scanf("%d %d", &N, &M);

    for(int i=1; i<=M; ++i)
    {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);

        G[x].push_back(y);
        G[y].push_back(x);

        capa[x][y]=z;
        capa[y][x]=0;
        flux[x][y]=0;
        flux[x][y]=0;
    }
}

int viz[NMax];
int dad[NMax];

int BFS()
{

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

    Q.push(mp(1,0));
    viz[1]=1;

    while(!Q.empty())
    {
        int x=Q.front().first;
        int y=Q.front().second;
        Q.pop();

        if(x  == N)
            continue;

        vector < int > ::iterator it;

        for(it=G[x].begin(); it!=G[x].end(); ++it)
        {
            if(!viz[*it] &&
                    capa[x][*it] > flux[x][*it])
            {
                viz[*it]=1;
                dad[x]=y;
                Q.push(mp(*it,x));
            }
        }
    }

    if(!viz[N])
        return 0;

    int mini = 0x3f3f3f3f;

    for(vector<int>::iterator it = G[N].begin(); it!=G[N].end(); it++)
    {
        if(dad[N] == *it)
        {
            int nod=dad[N];

            while(nod)
            {
                if(capa[nod][dad[nod]] - flux[nod][dad[nod]] < mini)
                    mini = capa[nod][dad[nod]] - flux[nod][dad[nod]];

                nod=dad[nod];
            }

            nod=dad[N];
            while(nod)
            {
                flux[nod][dad[nod]] += mini;
                flux[dad[nod]][nod] -= mini;
                nod=dad[nod];
            }
        }

    }
}

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

    int rez=0;
    Read();
    while(BFS())
    {
        rez=0;
        for(vector<int>::iterator it = G[N].begin(); it!=G[N].end(); it++)
            rez += flux[*it][N];

    }

    cout<<rez;
    return 0;
}