Cod sursa(job #1511297)

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

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

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

    }

    dist[s]=0;
    while(!q.empty())
        q.pop();
    l=1;
    q.push(s);
    //q[l]=s;
    memset(u,0,sizeof(u));

    u[s]=1;

    while(!q.empty())
    {
        long long k=q.front();
        q.pop();
        for(long long j=0;j<v[k].size();j++)
        {
            if(c[k][v[k][j]]-f[k][v[k][j]]>0 && dist[k] + cost[k][v[k][j]]<dist[v[k][j]])
            {

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

                    l++;
                    q.push(v[k][j]);
                    u[v[k][j]]=1;
                }
            }
        }
        u[k]=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;
}