Cod sursa(job #899585)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 28 februarie 2013 15:16:52
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
FILE*in=fopen("maxflow.in","r");
FILE*out=fopen("maxflow.out","w");
int muchii,noduri,tata[1001];
int capacity[1001][1001],flow[1001][1001];
vector< int > a[1001];
queue <int> q;
bool parcurgere();
int main()
{
    int flux_final=0;
    fscanf(in,"%d%d",&noduri,&muchii);
    for(int i=1;i<=muchii;++i)
    {
        int data1,data2,data3;
        fscanf(in,"%d%d%d",&data1,&data2,&data3);
        a[data1].push_back(data2);
        a[data2].push_back(data1);
        capacity[data1][data2]=data3;
    }
    while(parcurgere())
    {
        for(int i=0;i<(int)a[noduri].size();++i)
         {
            if(!tata[a[noduri][i]] || (capacity[a[noduri][i]][noduri]==flow[a[noduri][i]][i]))
                continue;
            tata[noduri]=a[noduri][i];
            int minim=(1<<30)-1;
            for(int j=noduri;j!=1;j=tata[j])
                minim=min(minim,capacity[tata[j]][j]-flow[tata[j]][j]);
            flux_final+=minim;
            for(int j=noduri;j!=1;j=tata[j])
            {
                flow[j][tata[j]]-=minim;
                flow[tata[j]][j]+=minim;
            }
        }
    }
    fprintf(out,"%d",flux_final);
fclose(in);
fclose(out);
return 0;
}
bool parcurgere()
{
    while(!q.empty())
        q.pop();
    q.push(1);
    memset(tata,0,sizeof(tata));
    tata[1]=-1;
    while(!q.empty())
    {
        int curent=q.front();
        q.pop();
        for(int i=0;i<(int)a[curent].size();++i)
        {
            if(!tata[a[curent][i]] && capacity[curent][a[curent][i]]!=flow[curent][a[curent][i]])
            { // nu e taicato si mai e loc pe acolo
                tata[a[curent][i]]=curent;
                q.push(a[curent][i]);
            }
        }
    }
    if(tata[noduri])
        return true;
    else
        return false;
}