Cod sursa(job #518461)

Utilizator APOCALYPTODragos APOCALYPTO Data 31 decembrie 2010 23:04:22
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<cstring>
#define pb push_back
#define oo 0x3f3f3f3f
struct nod
{
    int lg;
    int c;
};

ofstream fout("fmcm.out");
vector<nod> G[10000];
int q[1000000];
int ante[10000];
int viz[10000];

int isinq[10000];
int d[10000];
int C[10000][10000];
int F[10000][10000];
int S,D,N,M;
int cost_minim;
bool BFS()
{   vector<nod>::iterator it;
    memset(ante,0,sizeof(ante));
    memset(viz,0,sizeof(viz));
    memset(q,0,sizeof(q));
    memset(isinq,0,sizeof(isinq));
    int i,u;
    for(i=1;i<=N;i++)
       d[i]=oo;
    d[S]=0;
    viz[S]=1;
    cost_minim=oo;
    q[++q[0]]=S;
    isinq[S]=1;
    int front=1;
    while(front<=q[0])
    {
        u=q[front++];
        isinq[u]=0;
        //cout<<u<<" ";
        for(it=G[u].begin();it<G[u].end();it++)
        {   //cout<<it->lg;
            if(d[it->lg]>d[u]+it->c &&C[u][it->lg]>F[u][it->lg])
            {
                d[it->lg]=d[u]+it->c;
                ante[it->lg]=u;
                viz[it->lg]=1;
                if(!isinq[it->lg])
                {
                    q[++q[0]]=it->lg;
                    isinq[it->lg]=1;

                }
            }
        }
    }

    cost_minim=d[D];
    return viz[D];
}


void solve()
{
    int flow,fmin,i;
    vector<nod>::iterator it;
    for(flow=0;BFS();)
    {
        fmin=C[ante[D]][D]-F[ante[D]][D];
        for(i=ante[D];i!=S;i=ante[i])
        {
            fmin=min(fmin,C[ante[i]][i]-F[ante[i]][i]);

        }

        F[ante[D]][D]+=fmin;
        F[D][ante[D]]-=fmin;

        for(i=ante[D];i!=S;i=ante[i])
        {
        F[ante[i]][i]+=fmin;
        F[i][ante[i]]-=fmin;
        }

        flow+=cost_minim*fmin;

    }

    fout<<flow<<"\n";
}

void cit()
{   int x,y,f,c;
    ifstream fin("fmcm.in");
    int i;
    fin>>N>>M>>S>>D;
    for(i=1;i<=M;i++)
    {
        fin>>x>>y>>f>>c;
        C[x][y]=f;
        G[x].pb((nod){y,c});
        G[y].pb((nod){x,-c});
    }

    fin.close();
}

int main()
{
    cit();

    solve();

    fout.close();

    return 0;
}