Cod sursa(job #2267357)

Utilizator dacianouaPapadia Mortala dacianoua Data 23 octombrie 2018 16:04:26
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
#include <iostream>

#include <fstream>

#define nmax 1024

using namespace std;

ifstream fin("maxflow.in");

ofstream fout("maxflow.out");

int n,m,tata[nmax],cap[nmax][nmax],Q[nmax],f[nmax+5][nmax+5],flow=0;

bool viz[nmax];

struct nod

{

    int info;

    nod *urm;

}*v[nmax+5],*d,*e[nmax+5];

int minv(int a, int b)

{

    return a<b?a:b;

}

bool bfs(bool x)

{

    Q[0]=Q[1]=1;

    viz[1]=x;

    nod *c;

    for(int i=1;i<=Q[0];i++)

    {

        c=v[Q[i]];

        if(Q[i]==n)continue;

        while(c->urm)

        {

            c=c->urm;

            if(viz[c->info]!=x && cap[Q[i]][c->info]-f[Q[i]][c->info]>0)

            {

                viz[c->info]=x;

                Q[++Q[0]]=c->info;

                tata[c->info]=Q[i];

            }

        }

    }

    return viz[n]==x;

}

void flux()

{

    bool gg=1;

    nod *ee;

    int tati,fmin=0x3f3f3f3f;

    while(bfs(gg))

    {

        ee=v[n];

        while(ee->urm)

        {

            fmin=0x3f3f3f3f;

            ee=ee->urm;

            if(cap[ee->info][n]==f[ee->info][n] || viz[ee->info]==!gg)continue;

            tata[n]=ee->info;

            for(int i=n;i!=1;i=tata[i])

                fmin=minv(fmin,cap[tata[i]][i]-f[tata[i]][i]);

            for(int i=n;i!=1;i=tata[i])

                f[tata[i]][i]+=fmin,f[i][tata[i]]+=fmin;

            flow+=fmin;

        }

        gg=!gg;

    }

}

int main()

{

    int x,y,z;

    fin>>n>>m;

    for(int i=1;i<=n;i++)

    {

        v[i]=new nod;

        v[i]->info=i;

        v[i]->urm=0;

    }

    while(fin>>x>>y>>z)

    {

        if(!v[x]->urm)

        {

            d=new nod;

            d->urm=0;

            d->info=y;

            v[x]->urm=d;

            e[x]=d;

        }

        else

        {

            d=new nod;

            d->urm=0;

            d->info=y;

            e[x]->urm=d;

            e[x]=d;

        }

        if(!v[y]->urm)

        {

            d=new nod;

            d->urm=0;

            d->info=x;

            v[y]->urm=d;

            e[y]=d;

        }

        else

        {

            d=new nod;

            d->urm=0;

            d->info=x;

            e[y]->urm=d;

            e[y]=d;

        }

        cap[x][y]=cap[y][x]=f[y][x]=z;

    }

    flux();

    fout<<flow<<"\n";

    return 0;

}