Cod sursa(job #703058)

Utilizator Ast09Stoica Anca Ast09 Data 2 martie 2012 10:42:31
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<fstream>
#include<queue>
#include<cstring>
#include<climits>
using namespace std;

ifstream f("fmcm.in");
ofstream g("fmcm.out");

int a,b,n,m,j,i,s,d,c,costmin,cc[355],viz[1001],z,tata[355],cost[355][355],cap[355][355],fluxmax,flux[355][355];

struct nod
{
    int x;
    nod *next;
}   *v[355],*p;

queue<int> q;

int bf()
{
    int w,vecin;
    memset(viz,0,sizeof(viz));
    memset(tata,0,sizeof(tata));

    for(i=1;i<=n;++i) cc[i]=INT_MAX;

    q.push(s);
    viz[s]=1;
    cc[s]=0;

    while(!q.empty())
    {
        w=q.front();
        p=v[w];
        viz[w]=0;
        q.pop();

        while(p)
        {
            vecin=p->x;
            if( (cc[vecin]>cc[w]+cost[w][vecin] )&&flux[w][vecin]<cap[w][vecin])
            {
                if(!viz[vecin]) q.push(vecin),viz[vecin]=1;

                tata[vecin]=w;
                cc[vecin]=cc[w]+cost[w][vecin];
            }
            p=p->next;
        }
    }
    return (cc[d]<INT_MAX);
}

int main()
{

    f>>n>>m>>s>>d;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c>>z;
        p=new nod;
        p->x=b;
        p->next=v[a];
        v[a]=p;

        p=new nod;
        p->x=a;
        p->next=v[b];
        v[b]=p;

        cap[a][b]=c;
        cost[a][b]=z;
        cost[b][a]=-z;
    }

    while(bf())
    {
        //for(i=1;i<=n;++i) g<<cc[i]<<' ';
        //g<<'\n';
        int minim=cap[tata[d]][d]-flux[tata[d]][d];
        //if(!minim) return 1;
        for(j=tata[d];j!=s;j=tata[j])
            if(minim>cap[tata[j]][j]-flux[tata[j]][j])  minim=cap[tata[j]][j]-flux[tata[j]][j];

            flux[tata[d]][d]+=minim;
            flux[d][tata[d]]-=minim;

            costmin+=minim*cc[d];

            for(j=tata[d];j!=s;j=tata[j])
            {
                flux[tata[j]][j]+=minim;
                flux[j][tata[j]]-=minim;
            }

            fluxmax+=minim;
    }

    g<<costmin<<'\n';

    f.close();
    g.close();
    return 0;
}