Cod sursa(job #867220)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 29 ianuarie 2013 13:12:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 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;
    }
    //int parcurgeri = 0;
    while(parcurge())
    {
        for(int i=0;i<(int)a[final].size();++i)
        {

            if(!tata[a[final][i]] || flux[a[final][i]]==capacitate[a[final][i]])
                continue;
            tata[final]=a[final][i];
            flux_final+=backup(final);
            minim=9999;
        }
        //printf("%d\n",++parcurgeri);
    }
    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();
        if(curent==final)
            break;
        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(tata[final])
        return true;
    else
        return false;
}
int backup(int nod)
{
    for(int i=nod;i!=1;i=tata[i])
        minim=min(minim,capacitate[tata[i]][i]-flux[tata[i]][i]);
    for(int i=nod;i!=1;i=tata[i])
    {
        flux[tata[i]][i]+=minim;
        flux[i][tata[i]]-=minim;
    }
    return minim;
}