Cod sursa(job #1397823)

Utilizator andreimdvMoldovan Andrei andreimdv Data 23 martie 2015 19:33:26
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
//Flux Maxim maxflow cu Ford-Fulkerson -- foloeste notiunea de michie reziduala pentru a gasi solutia optima
//https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-section-1/
#include <fstream>
#include<vector>
#include<queue>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");


int n,m,i,j,a,capacitate,fluxmax,cost[1010][1010],b,c,aux,x,tata[1010];
vector<int> v[1010];
queue<int> q;

int bfs()
{
    for(i=1;i<=n;++i) tata[i]=0;
    q.push(1);
    while(!q.empty())
    {
        aux=q.front();
        q.pop();
        for(i=0;i<(int)v[aux].size();++i)
        {
            if(tata[v[aux][i]]==0&&cost[aux][v[aux][i]]>0)
            {
                tata[v[aux][i]]=aux;
                q.push(v[aux][i]);
            }
        }
    }
    return tata[n]; // 0 daca nu mai exista drum de la start la finish
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;++i)
    {
        fin>>a>>b>>c;
        cost[a][b]=c;
        //PARTICULAR:  PENTRU CA ALGORITMUL SA FUNCIONEZE daca exista muchia b-a si trebuie sa adaugam a-b, creeam un nou nod c si avem muchie a-c, c-b
        v[a].push_back(b);
        v[b].push_back(a);
    }

    while(bfs()) // cat timp exista un drum de la start(1) la finish(n) creeam vectorul de tati
    {
        for(j=0;j<(int)v[n].size();++j) //pentru fiecare lant
        {
            x=v[n][j];
            if(cost[x][n]>0&&tata[x])
            {
                capacitate=cost[x][n];
                for(i=x;i!=1;i=tata[i]) capacitate=min(capacitate,cost[tata[i]][i]);
                for(i=x;i!=1;i=tata[i])
                {
                    cost[tata[i]][i]-=capacitate;
                    cost[i][tata[i]]+=capacitate;
                }
                cost[x][n]-=capacitate;
                fluxmax+=capacitate;
            }

        }
    }
    fout<<fluxmax;



    return 0;
}