Cod sursa(job #2234728)

Utilizator ianiIani Biro iani Data 25 august 2018 23:53:25
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <queue>

#define NRNOD 1005
#define INF 2000000000;

using namespace std;

queue<int> q;

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

struct graf
{
    int source,target,cap,cur;
    graf *next,*rev;
}*a[NRNOD],*prec[NRNOD];

int main()
{
    int n,m,maxFlow=0;
    fin>>n>>m;
    for (int i=0;i<m;i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        graf *nou=new graf;
        nou->source=x;
        nou->target=y;
        nou->cap=c;
        nou->cur=0;
        nou->next=a[x];
        graf *inv=new graf;
        inv->source=y;
        inv->target=x;
        inv->cap=c;
        inv->cur=0;
        inv->next=a[y];
        inv->rev=nou;
        a[y]=inv;
        nou->rev=inv;
        a[x]=nou;
    }
    do
    {
        for (int i=1;i<=n;i++)
            prec[i]=NULL;
        q.push(1);
        while (!q.empty())
        {
            int nod=q.front();
            q.pop();
            for (graf* j=a[nod];j!=NULL;j=j->next)
                if(prec[j->target]==NULL&&j->target!=1&&j->cap>j->cur)
                {
                    prec[j->target]=j;
                    q.push(j->target);
                }
        }
        if(prec[n]!=NULL)
        {
            int deltaFlow=INF;
            for (graf* edge=prec[n];edge!=NULL;edge=prec[edge->source])
                deltaFlow=min(deltaFlow,edge->cap-edge->cur);
            for (graf* edge=prec[n];edge!=NULL;edge=prec[edge->source])
            {
                edge->cur+=deltaFlow;
                edge->rev->cur-=deltaFlow;
            }
            maxFlow+=deltaFlow;
        }
    }
    while(prec[n]!=NULL);
    fout<<maxFlow;
    /*for (int i=1;i<=n;i++)
        for (graf *j=a[i];j!=NULL;j=j->next)
            cout<<j->source<<"->"<<j->target<<": "<<j->cur<<'/'<<j->cap<<endl;*/
    return 0;
}