Cod sursa(job #1467800)

Utilizator horiainfoTurcuman Horia horiainfo Data 4 august 2015 20:49:54
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <vector>
#include <bitset>

#define MAX_NOD 1003
#define INF 1000200200
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");


struct _flows{int limit,actual;};
struct _vecin{int nod,leg;};
struct coada{int nod,ant,muchie,flow;} co[MAX_NOD];
struct nod{vector<_vecin> vecini; vector<_flows> flows;} mat[MAX_NOD];

int maxFlow, n, m, x, y, z;
bitset<MAX_NOD> viz;

void callback(int poz)
{
    int nod;
    int flow = co[poz].flow;
    maxFlow += co[poz].flow;
    while(poz!=1)
    {
        nod = co[co[poz].ant].nod;
        mat[nod].flows[co[poz].muchie].actual += flow;
        mat[co[poz].nod].flows[mat[nod].vecini[co[poz].muchie].leg].actual-=flow;
        poz = co[poz].ant;
    }
}

bool bfs()
{
    int inc = 1, sf = 1;
    nod _nod;
    co[inc].nod=1; co[inc].ant=0; co[inc].muchie = -1; co[inc].flow=INF;
    for(int i=1;i<=n;i++)
        viz[i]=0;
    viz[1]=1;
    while(inc<=sf)
    {
        _nod = mat[co[inc].nod];
        for(int i=0;i<_nod.vecini.size();i++)
            if(viz[_nod.vecini[i].nod]==0 && _nod.flows[i].actual<_nod.flows[i].limit)
            {
                co[++sf].nod = _nod.vecini[i].nod;
                co[sf].ant = inc;
                co[sf].muchie = i;
                co[sf].flow = _nod.flows[i].limit-_nod.flows[i].actual > co[inc].flow ? co[inc].flow : _nod.flows[i].limit-_nod.flows[i].actual;

                if(co[sf].nod == n)
                {
                    callback(sf);
                    return 1;
                }
            }
        inc++;
    }
    return 0;
}
int main()
{
    fin>>n>>m;
    _flows flow;
    _vecin vecin;

    flow.actual = 0;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        vecin.nod = y; vecin.leg = mat[y].vecini.size();
        mat[x].vecini.push_back(vecin);
        flow.limit = z;
        mat[x].flows.push_back(flow);

        vecin.nod = x; vecin.leg = mat[x].vecini.size()-1;
        mat[y].vecini.push_back(vecin);
        flow.limit = 0;
        mat[y].flows.push_back(flow);
    }

    while(bfs());

    fout<<maxFlow;
    return 0;
}