Cod sursa(job #1940694)

Utilizator stefanchistefan chiper stefanchi Data 26 martie 2017 19:25:43
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <vector>
#include <cstdio>
#include <bitset>
#include <queue>
#define Nmax 1005
#define Capmax 110000
using namespace std;
queue <int> coada;
vector <int > graf[Nmax];
int flux[Nmax][Nmax];
int capacitate[Nmax][Nmax];
int n,m;
int tata[Nmax];
bitset <Nmax> viz;

void read()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int x,y,c;
    scanf("%d %d",&n,&m);
    for(int i = 0  ; i < m ; i++)
    {
        scanf("%d %d %d",&x,&y,&c);
        graf[x].push_back(y);
        graf[y].push_back(x);
        capacitate[x][y] = c;
    }
}

bool bfs(int start)
{
    coada.push(start);
    viz[start] = true;
    while(!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        if( nod == n)
            continue;
        for(vector <int> :: iterator it = graf[nod].begin() ; it!= graf[nod].end(); it++)
        {
            if(viz[*it] == false &&capacitate[nod][*it] > flux[nod][*it])
            {
                viz[*it]  = true;
                tata[*it] = nod;
                coada.push(*it);
            }
        }
    }
    return viz[n];

}


void rezolvare()
{
    int flux_total = 0;
    while(bfs(1))
    {
        for(vector <int> :: iterator it = graf[n].begin() ; it != graf[n].end(); it++)
        {
            if(viz[*it] == 1 && capacitate[*it][n] > flux[*it][n])
            {

                int marire = 110000;
                int aux = n;
                while(aux != 1)
                {
                    if(marire > capacitate[tata[aux]][aux] - flux[tata[aux]][aux])
                        marire = capacitate[tata[aux]][aux] - flux[tata[aux]][aux];
                    aux = tata[aux];
                }
                flux_total += marire;
                aux = n;
                while(aux != 1)
                {
                    flux[tata[aux]][aux] += marire;
                    flux[aux][tata[aux]] -= marire;
                    aux = tata[aux];
                }
            }

        }
        viz.reset();
        for(int i = 1 ; i <= n ; i++)
            tata[i] = 0;
    }
    printf("%d",flux_total);
}



int main()
{
    read();
    rezolvare();
    return 0;
}