Cod sursa(job #984136)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 13 august 2013 17:00:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <bitset>
using namespace std;
int C[1005][1005],n,m,sol,prec[5005];
vector <int> v[1005];
bitset <1005> apar;
int bfs()
{
    int i,nod,nodc;
    for (i=0;i<=5002;i++) prec[i]=0;
    for (i=0;i<=1005;i++) apar[i]=0;
    queue <int> q;
    q.push(1);
    apar[1]=1;
    while (!q.empty())
    {
        nod=q.front();
        q.pop();
        for (i=0;i<v[nod].size();i++)
        {
            nodc=v[nod][i];
            if (!apar[nodc])
                if (C[nod][nodc]>0)
                {
                    prec[nodc]=nod;
                    apar[nodc]=1;
                    if (nodc!=n)
                        q.push(nodc);
                }
        }
    }
    return apar[n];
}
int main()
{
    fstream f,g;
    f.open("maxflow.in",ios::in);
    g.open("maxflow.out",ios::out);
    f>>n>>m;
    int i,x,y,c,nodc,nodprec,curent;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        v[x].push_back(y);
        v[y].push_back(x);// graf rezidual
        C[x][y]=c;
    }
    while (bfs())
        for (i=0;i<v[n].size();i++)
            if (apar[v[n][i]] && C[v[n][i]][n]>0)
            {
                curent=C[v[n][i]][n];
                nodc=v[n][i];
                do
                {
                    nodprec=prec[nodc];
                    curent=min(curent,C[nodprec][nodc]);
                    nodc=nodprec;
                }while (nodc!=1);
                sol+=curent;
                C[v[n][i]][n]-=curent;
                C[n][v[n][i]]+=curent;
                nodc=v[n][i];
                do
                {
                    nodprec=prec[nodc];
                    C[nodprec][nodc]-=curent;
                    C[nodc][nodprec]+=curent;
                    nodc=nodprec;
                }while (nodc!=1);
            }
    g<<sol;
}