Cod sursa(job #866652)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 28 ianuarie 2013 16:13:50
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<stdio.h>    // date de intrare: nodul de final ( nodul de inceput este 1 )
#include<vector>      // muchii, noduri & 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[1000],final,capacitate[1000][1000];
int minim=9999,flux_final=0;
int backup(int nod);
queue <int> coada;
bool parcurge();
vector<int> a[1000];
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);
        capacitate[nody][nodz]=cost;
    }
    while(parcurge())
    {
        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]])  // mai ai loc pe acolo
                {
                    tata[a[curent][i]]=curent;
                    coada.push(a[curent][i]);
                }
        }
    }
    if(tata[final])
        return true;
    else
        return false;
}
int backup(int nod)
{
    if(nod!=1)
    {
        minim=min(minim,capacitate[tata[nod]][nod]);
        backup(tata[nod]);
        capacitate[tata[nod]][nod]-=minim;
    }
    return minim;
}