Cod sursa(job #1938337)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 24 martie 2017 19:22:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>

#define NMAX 1005
#define inf 0x3f3f3f3f

using namespace std;

int N,M;
int capacitate[NMAX][NMAX];
int utilizat[NMAX][NMAX];
vector<int> graf[NMAX];


int viz[NMAX];
int t[NMAX];
void citire()
{
    scanf("%d%d",&N,&M);


    for(int i=1; i<=M; i++)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        capacitate[x][y]=c;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }
}

queue<int> q;

int rez;
int rezolva()
{
    int ok=0;
    q.push(1);
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    while(!q.empty())
    {
        int nod_curent = q.front();
        q.pop();
        if(nod_curent == N)
            continue;
        for(vector<int>::iterator ii=graf[nod_curent].begin(); ii!=graf[nod_curent].end(); ii++)
        {
            int i = *ii;
            if(!viz[i] && capacitate[nod_curent][i] != utilizat[nod_curent][i])
            {
                viz[i]=1;
                q.push(i);
                t[i]=nod_curent;
            }
        }
    }

    for(vector<int>::iterator ii=graf[N].begin(); ii!=graf[N].end(); ii++)
    {

        int vecin = *ii;
        t[N]=vecin;
        if(viz[vecin] && capacitate[vecin][N]!=utilizat[vecin][N])
        {
            ok = 1;
            int x = N;
            int minim = inf;
            while(x!=1)
            {
                minim = min(minim, capacitate[t[x]][x]-utilizat[t[x]][x]);
                x=t[x];
            }
            x=N;
            while(x!=1)
            {
                utilizat[t[x]][x] += minim;
                utilizat[x][t[x]] -= minim;
                x=t[x];
            }
            rez+=minim;
        }
    }


    return ok;
}


int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    citire();
    while(rezolva());
    printf("%d",rez);

    return 0;
}