Cod sursa(job #867186)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 29 ianuarie 2013 12:19:49
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<stdio.h>    // date de intrare: nodul de final ( nodul de inceput este 1 )
#include<vector>      // noduri, muchii & config grafului
#include<queue>
#include<math.h>
using namespace std;
FILE*in=fopen("maxflow.in","r");
FILE*out=fopen("maxflow.out","w");
int muchii,noduri,tata[1008],final,capacitate[1008][1008],flux[1008][1008];
int minim=(1<<30)-1,flux_final=0;
int backup(int nod);
queue <int> coada;
bool parcurge();
vector<int> a[1008];
int main()
{
    //fscanf(in,"%d",&final);
    fscanf(in,"%d%d",&noduri,&muchii);
    final=noduri;
    for(int i=0;i<muchii;++i)
    {
        int nody,nodz,cost;
        fscanf(in,"%d%d%d",&nody,&nodz,&cost);
        a[nody].push_back(nodz);
        a[nodz].push_back(nody);
        capacitate[nody][nodz]=cost;
        //capacitate[nodz][nody]=-cost;
    }
    while(parcurge())
    {
        for(int i=0;i<(int)a[final].size();++i)
        {
            tata[final]=a[final][i];
            if(!tata[a[final][i]])
                continue;
            backup(final);
            flux_final+=minim;
            minim=9999;
        }
    }
    fprintf(out,"%d",flux_final);

}
bool parcurge()
{
    //bool vizitat[1000];
    while(!coada.empty())
        coada.pop();
    for(int i=1;i<=noduri;++i)
        tata[i]=0;
    coada.push(1);
    while(!coada.empty())
    {
     int curent=coada.front();
     coada.pop();
        for(int i=0;i<(int)a[curent].size();++i)
        {
            if(!tata[a[curent][i]])
                if(capacitate[curent][a[curent][i]]!=flux[curent][a[curent][i]])  // mai ai loc pe acolo
                {
                    tata[a[curent][i]]=curent;
                    coada.push(a[curent][i]);
                }
        }
    if(curent==final)
        break;
    }
    return(tata[final]);
}
int backup(int nod)
{
    if(nod!=1)
    {
        if(capacitate[tata[nod]][nod]>0)
            minim=min(minim,capacitate[tata[nod]][nod]);
        backup(tata[nod]);
        flux[tata[nod]][nod]+=minim;
    }
    return minim;
}