Cod sursa(job #2246865)

Utilizator ianiIani Biro iani Data 27 septembrie 2018 17:26:20
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 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=0;
        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)
            //for (graf* j=a[n]; j!=NULL; j=j->next)
            {
                //if (j->rev->cur >= j->rev->cap|| prec[j->rev->target]==NULL) continue;
                //prec[n]=j->rev;

                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<<(char)(j->source+'A'-1)<<"->"<<(char)(j->target+'A'-1)<<": "<<j->cur<<'/'<<j->cap<<endl;*/
    return 0;
}