Cod sursa(job #1936010)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 22 martie 2017 19:41:31
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>
#include <queue>
#include <bitset>
#include <vector>
#define INFINIT 0x3f3f3f3f
#define MAXN 1005
#include <cstring>
using namespace std;

bool marcat[MAXN];
queue<int> coada;
vector<int> graf[MAXN];
int n, m, capacitate[MAXN][MAXN], flux[MAXN][MAXN], tata[MAXN];

int parcurgere()
{
    memset(marcat,0,sizeof(marcat));
    coada.push(1);
    marcat[1]=1;
    while(!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        if(nod!=n)
        {
            for(int vecin : graf[nod])
            {
                if(!marcat[vecin] && capacitate[nod][vecin] != flux[nod][vecin])
                {
                    marcat[vecin] = 1;
                    tata[vecin] = nod;
                    coada.push(vecin);
                }
            }
        }
    }
    return marcat[n];
}

int Flux;

void citire()
{
    scanf("%d %d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int a, b, cp;
        scanf("%d %d %d ",&a,&b,&cp);
        capacitate[a][b] = cp;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
}

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

    for(citire(); parcurgere();)
    {
        for(int nod : graf[n])
        {
            if(marcat[nod] && capacitate[nod][n] != flux[nod][n])
            {
                int minim = INFINIT;
                int i=n;
                while(i!=1)
                {
                    minim = min(minim,capacitate[tata[i]][i] - flux[tata[i]][i]);
                    i = tata[i];
                }
                if(minim!=INFINIT)
                {
                    int i = n;
                    while(i!=1)
                    {
                        flux[i][tata[i]] -= minim;
                        flux[tata[i]][i] += minim;
                        i = tata[i];
                    }
                    Flux += minim;
                }

            }
        }
    }

    printf("%d\n",Flux);

    return 0;
}