Cod sursa(job #1435645)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 13 mai 2015 23:01:09
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <queue>
#define Nmax 355
#define INF 2000000000

using namespace std;

int n,Cost[Nmax][Nmax],C[Nmax][Nmax],F[Nmax][Nmax],S,D,prv[Nmax],dp[Nmax];
bool viz[Nmax];
queue <int> Q;
vector <int> L[Nmax];

inline bool Bellman()
{
    int i,nod;
    viz[S]=true; Q.push(S);
    for(i=1;i<=n;++i)
    {
        dp[i]=INF;
        prv[i]=0;
    }
    dp[S]=0;
    while(!Q.empty())
    {
        nod=Q.front(); Q.pop(); viz[nod]=false;
        for(auto it : L[nod])
            if(F[nod][it]<C[nod][it] && dp[it]>dp[nod]+Cost[nod][it])
            {
                dp[it]=dp[nod]+Cost[nod][it];
                prv[it]=nod;
                if(viz[it]) continue;
                Q.push(it); viz[it]=true;
            }
    }
    return (dp[D]!=INF);
}

int main()
{
    int m,x,y,c,z,maxflow=0,mincost=0;
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d", &n,&m,&S,&D);
    while(m--)
    {
        scanf("%d%d%d%d", &x,&y,&c,&z);
        C[x][y]=c; Cost[x][y]=z; Cost[y][x]=-z;
        L[x].push_back(y); L[y].push_back(x);
    }
    while(Bellman())
    {
        int sum=0,minim=INF;
        for(x=D;x!=S;x=prv[x])
        {
            sum+=Cost[prv[x]][x];
            minim=min(minim,C[prv[x]][x]-F[prv[x]][x]);
        }
        for(x=D;x!=S;x=prv[x])
        {
            F[prv[x]][x]+=minim;
            F[x][prv[x]]-=minim;
        }
        maxflow+=minim;
        mincost+=sum*minim;
    }
    printf("%d\n", mincost);
    return 0;
}