Cod sursa(job #2291207)

Utilizator dacianouaPapadia Mortala dacianoua Data 27 noiembrie 2018 19:14:24
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 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]=z;
    }
    flux();
    fout<<flow<<"\n";
    return 0;
}