Cod sursa(job #1161823)

Utilizator ThomasFMI Suditu Thomas Thomas Data 31 martie 2014 14:36:00
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define NMax 1005
#define inf 2100000000

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n,m;
int C[NMax][NMax],F[NMax][NMax];
int viz[NMax],ant[NMax];
vector<int> v[NMax];
queue<int> cd;

int BFS()
{
    int i,s;

    for(i=1;i<=n;i++) viz[i]=ant[i]=0;
    cd.push(1);
    viz[1]=1;

    while(!cd.empty())
    {
        s=cd.front(); cd.pop();

        if(s!=n) for(i=0;i<(int)v[s].size();i++)
        if(!viz[v[s][i]] && F[s][v[s][i]]<C[s][v[s][i]])
        {
            viz[v[s][i]]=1;
            cd.push(v[s][i]);
            ant[v[s][i]]=s;
        }
    }

    return viz[n];
}

int main()
{
    int i;
    int a,b,c;

    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        C[a][b]=c;
    }

    int nod,fmin,flow=0;

    while(BFS()) for(i=0;i<(int)v[n].size();i++)
    {
        if(viz[v[n][i]] && F[v[n][i]][n]<C[v[n][i]][n])
        {
            nod=n;
            fmin=inf;
            ant[n]=v[n][i];

            while(nod!=1)
            {
                fmin=min(fmin,C[ant[nod]][nod]-F[ant[nod]][nod]);
                nod=ant[nod];
            }

            nod=n;
            if(fmin) while(nod!=1)
            {
                F[ant[nod]][nod]+=fmin;
                F[nod][ant[nod]]-=fmin;
                nod=ant[nod];
            }

            flow+=fmin;
        }
    }

    g<<flow<<"\n";

    f.close();
    g.close();
    return 0;
}