Cod sursa(job #395207)

Utilizator hasegandaniHasegan Daniel hasegandani Data 12 februarie 2010 15:21:02
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include<stdio.h>
#include<vector>

using namespace std;

#define Nmax 360
#define inf 0x3f3f3f3f

vector <int> l[Nmax];

int n,m,S,D;
int F[Nmax][Nmax],C[Nmax][Nmax];
int c[Nmax],st,dr,p[Nmax],d[Nmax],poz[Nmax];
int Sol;

int BF()
{
    int nod;
    
    for(int i=1;i<=n;++i)
        {
        d[i]=inf;
        poz[i]=0;
        }
        
    d[S]=0;
    c[1]=S;
    poz[S]=1;
    
    for(st=1 , dr=1 ; st<=dr ; ++st)
        for(int i=0 ; i<(int)l[ c[st] ].size() ; ++i)
            {
            nod = l[ c[st] ][i];
            if (F[ c[st] ][nod]>0 && d[ nod ] > d[ c[st] ] + C[ c[st] ][nod])
                {
                d[ nod ] = d[ c[st] ] + C[ c[st] ][nod];
                if ( poz[nod] <= st)
                    {
                    c[++dr]= nod;
                    p[dr]= st;
                    poz[ nod ]=dr;
                    }
                else
                    p[ poz[nod] ]=st;
                }
            }
  /*  printf("c: ");
    for(int i=1;i<=dr;++i)
        printf("%d ",c[i]);
    printf("\n");
    printf("p: ");
    for(int i=1;i<=dr;++i)
        printf("%d ",p[i]);
    printf("\n");
    printf("d: ");
    for(int i=1;i<=n;++i)
        printf("%d ",d[i]);
    printf("\n");
    printf("\n");*/
    
    if (d[D]==inf)
        return 0;
    return 1;
}

void solve()
{
    int M;
    for(int x=1 ; x ; )
        {
            x=BF();
            if (!x)
                return ;
            M=inf;
            for(int i= poz[D] ; c[i]!=S ; i=p[i])
                if (M > F[ c[p[i]] ][ c[i] ])
                    M = F[ c[p[i]] ][ c[i] ];
                    
            for(int i= poz[D] ; c[i]!=S ; i=p[i])
                {
                F[ c[p[i]] ][ c[i] ] -= M;
                F[ c[i] ][ c[p[i]] ] += M;
                }
                
            Sol += M*d[D];
        }
}

void cit();

int main()
{
    cit();
    solve();
    printf("%d\n",Sol);
    
    return 0;
}

void cit()
{
    int a,b,c,f;
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&S,&D);
    for(int i=1;i<=m;++i)
        {
        scanf("%d%d%d%d",&a,&b,&f,&c);
        
        l[a].push_back(b);
        l[b].push_back(a);
        
        F[a][b]=f;
        C[a][b]=c;
        C[b][a]=-c;
        }
}