Cod sursa(job #1511274)

Utilizator ade_tomiEnache Adelina ade_tomi Data 26 octombrie 2015 12:04:44
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include<iostream>
#include<fstream>
#include<vector>
#define maxn 510
#include<cstring>

#define inf 2000000000
#define ll long long
#define maxx 1000010
using namespace std;
long long dist[maxn],from[maxn],c[maxn][maxn],cost[maxn][maxn],f[maxn][maxn],q[maxx],u[maxn],n,s,t,drum,l,d,m;
vector<int> v[maxn];
long long BellmanFord()
{

    long long i,j;
    //mem
    for(i=1;i<=n;i++)
    {
        dist[i]=inf;
        from[i]=-1;

    }

    dist[s]=0;

    l=1;

    q[l]=s;
    memset(u,0,sizeof(u));

    u[s]=1;

    for(i=1;i<=l;i++)
    {
        for(long long j=0;j<v[q[i]].size();j++)
        {

            if(c[q[i]][v[q[i]][j]]-f[q[i]][v[q[i]][j]]>0 && dist[q[i]] + cost[q[i]][v[q[i]][j]]<dist[v[q[i]][j]])
            {

                dist[v[q[i]][j]]= dist[q[i]] + cost[q[i]][v[q[i]][j]];
                from[v[q[i]][j]]=q[i];
                if(!u[v[q[i]][j]])
                {

                    l++;
                    q[l]=v[q[i]][j];
                    u[q[l]]=1;
                }
            }
        }
        u[q[i]]=0;

    }
    if(dist[d]!=inf)
    {


        long long vmin = inf;
        drum = 1;

        for (i = d; i != s; i = from[i]) vmin = min(vmin, c[from[i]][i] - f[from[i]][i]);

        for (i = d; i != s; i = from[i])
        {
            f[from[i]][i] += vmin;
            f[i][from[i]] -= vmin;
        }

        return vmin * dist[d];
    }
    return 0;


}
long long flux()
{

    long long rez=0;
    drum=1;
    while(drum)
    {

        drum=0;
        rez+=BellmanFord();
       // cout<<rez<<" ";
    }
    return rez;
}
int main()
{

    long long i,x,t,cap,z,y;
    ifstream cin("fmcm.in");
    ofstream cout("fmcm.out");
    cin>>n>>m>>s>>d;
    for(i=1;i<=m;i++)
    {

        cin>>x>>y>>cap>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=cap;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    cout<<flux()<<" ";
    return 0;
}