Cod sursa(job #1576546)

Utilizator sicsicFMI-Coteanu Vlad sicsic Data 22 ianuarie 2016 15:55:05
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
#define INF 9999999999
#define Nmax 353
int N,M,Cost[Nmax][Nmax],C[Nmax][Nmax],F[Nmax][Nmax],T[Nmax],S,D,flux=0,drum=0,c=0;
bool U[Nmax];
struct lista{int nod; lista *leg;} *G[Nmax];
void adaug(int i,int j)
{
    lista *p;
    p=new lista;
    p->nod=j;
    p->leg=G[i];
    G[i]=p;
}
void citire()
{
    f>>N>>M>>S>>D;
    int i,j,c,z;
    while(M--)
    {
        f>>i>>j>>c>>z;
        adaug(i,j);
        adaug(j,i);
        C[i][j]=c;
        Cost[i][j]=z;
        Cost[j][i]=-z;
    }
}
int BF(int S,int D)
{
    int p,u,nod,Q[5*Nmax],Dist[Nmax];
    lista *q;
    memset(T,0,sizeof T);
    for(int i=1;i<=N;++i) Dist[i]=INF;
    memset(U,0,sizeof U);
    p=u=1;
    Q[p]=S; T[S]=-1; Dist[S]=0;
    while(p<=u)
    {
        int nod=Q[p];
        for(q=G[nod];q;q=q->leg)
           if(C[nod][q->nod]>F[nod][q->nod]&&Dist[q->nod]>Dist[nod]+Cost[nod][q->nod])
           {
               Dist[q->nod]=Dist[nod]+Cost[nod][q->nod];
               T[q->nod]=nod;
               if(!U[q->nod]) // daca nu se afla deja in coada
               {
                   u++; Q[u]=q->nod; U[q->nod]=1;
               }
           }
        U[nod]=0; // se scoata din coada elementul curent
        p++;
    }
    if(T[D]) {c=Dist[D]; return 1;}
    else return 0;
}
void flow(int S,int D)
{
    int i,r;
    for(flux=0,drum=0;BF(S,D);flux+=r,drum+=r*c)
    {
        i=D; r=INF;
        while(i-S)
        {
            r=min(r,C[T[i]][i]-F[T[i]][i]);
            i=T[i];
        }
        i=D;
        while(i-S)
        {
            F[T[i]][i]+=r;
            F[i][T[i]]-=r;
            i=T[i];
        }
    }
}
int main()
{
    citire();
    flow(S,D);
    g<<drum<<'\n';
    return 0;
}