Cod sursa(job #978644)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 29 iulie 2013 13:20:08
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.97 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
struct la
{
    int ind,cap;
    la *urm;
} *p,*q;
struct nod
{
    la *urm;
} v[1005];
int i,n,m,x,y,c,s,ax;
int f1()
{
    int nvl,mn;
    struct vectorlee
    {
        int val,cap,orig;
        la *ca;
    } vl[1005];
    bitset <1005> vb;
    for (i=1;i<=n;i++)
    {
        vb[i]=0;
        vl[i].val=vl[i].cap=vl[i].orig=0;
        vl[i].ca=NULL;
    }
    vl[1].val=1;
    vb[1]=1;
    nvl=1;
    for (i=1;i<=nvl;i++)
    {
        p=v[vl[i].val].urm;
        q=NULL;
        while (p!=NULL)
        {
            if (vb[p->ind]==0)
            {
                nvl++;
                vl[nvl].val=p->ind;
                vl[nvl].cap=p->cap;
                vl[nvl].orig=i;
                vl[nvl].ca=q;
                vb[p->ind]=1;
                if (p->ind==n)
                {
                    i=nvl;
                    mn=2000000000;
                    while (i!=1)
                    {
                        if (vl[i].cap<mn)
                            mn=vl[i].cap;
                        i=vl[i].orig;
                    }
                    while (nvl!=1)
                    {
                        p=vl[nvl].ca;
                        if (p!=NULL)
                        {
                            p->urm->cap-=mn;
                            if (p->urm->cap==0)
                            {
                                q=p->urm;
                                p->urm=q->urm;
                                delete(q);
                            }
                        }
                        else
                        {
                            p=v[vl[vl[nvl].orig].val].urm;
                            p->cap-=mn;
                            if (p->cap==0)
                            {
                                v[vl[vl[nvl].orig].val].urm=p->urm;
                            }
                        }
                        nvl=vl[nvl].orig;
                    }
                    return mn;
                }
            }
            q=p;
            p=p->urm;
        }
    }
    return 0;
}
int main(void)
{
    for (i=0;i<1004;i++)
        v[i].urm=NULL;
    FILE * f;
    f=fopen("maxflow.in","r");
    ofstream g("maxflow.out");
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&x,&y,&c);
        if (v[x].urm==NULL)
        {
            p=new(la);
            p->ind=y;
            p->cap=c;
            v[x].urm=p;
            p->urm=NULL;
        }
        else
        {
            q=v[x].urm;
            while (q->urm!=NULL)
                q=q->urm;
            p=new(la);
            p->ind=y;
            p->cap=c;
            q->urm=p;
            p->urm=NULL;
        }
    }
    s=0;
    ax=f1();
    while (ax!=0)
    {
        s=s+ax;
        ax=f1();
    }
    g<<s;
    g.close();
    return 0;
}