Cod sursa(job #1022355)

Utilizator george_stelianChichirim George george_stelian Data 5 noiembrie 2013 11:14:42
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#define inf 1000000000

using namespace std;

vector<short int>v[400],v1[400];
int t[400],s[400],c1[400][400],c2[400][400],c3[400][400],dist[400];
int n,m,a1,a2,a3,a4,x,y,nod,i,j,lim,q,sol,sol1;
void mf()
{
    int i,j,nod,lim;
    sol=1;
    for(i=1;i<=n;i++) s[i]=inf;
    s[x]=0;
    while(sol)
    {
        sol=0;
        for(i=1;i<=n;i++)
        {
            lim=v[i].size();
            for(j=0;j<lim;j++)
            {
                nod=v[i][j];
                if(c1[i][nod]-c3[i][nod] && s[i]+dist[i]+c2[i][nod]-dist[nod]<s[nod])
                {
                    s[nod]=s[i]+dist[i]+c2[i][nod]-dist[nod];
                    t[nod]=i;
                    sol=1;
                }
            }
        }
    }
}

int main()
{
    freopen("fmcm.in", "r", stdin);
    freopen("fmcm.out", "w", stdout);
    scanf("%d%d%d%d",&n,&m,&x,&y);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
        v[a1].push_back(a2);
        v[a2].push_back(a1);
        v1[a1].push_back(a2);
        c1[a1][a2]=a3;
        c2[a1][a2]=a4;
        c1[a2][a1]=0;
        c2[a2][a1]=-a4;
    }
    for(i=1;i<=n;i++) dist[i]=inf;
    dist[x]=0;
    for(i=1;i<n;i++)
    {
        a1=0;
        for(j=1;j<=n;j++)
        {
            lim=v1[j].size();
            for(q=0;q<lim;q++)
            if(dist[j]+c2[j][v1[j][q]]<dist[v1[j][q]])
            {
                a1=1;
                dist[v1[j][q]]=dist[j]+c2[j][v1[j][q]];
            }
        }
        if(a1==0) break;
    }
    sol1=0;
    while(n)
    {
        mf();
        if(s[y]<inf)
        {
            a1=inf;
            for(i=y;i!=x;i=t[i])
            {
                a1=min(a1,c1[t[i]][i]-c3[t[i]][i]);
            }
            for(i=y;i!=x;i=t[i])
            {
                c3[t[i]][i]+=a1;
                c3[i][t[i]]-=a1;
                sol1+=a1*c2[t[i]][i];
            }
        }
        else break;
    }
    printf("%d",sol1);
    fclose(stdin);
    fclose(stdout);
    return 0;
}