Cod sursa(job #2189721)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 28 martie 2018 21:21:29
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <queue>
#define pb push_back
#define mp make_pair
using namespace std;
const int nmax=355,INF=100000000;
int f[nmax][nmax],c[nmax][nmax],d[nmax][nmax],t[nmax],dist[nmax],vis[nmax],upd[nmax];
queue<int>q;
vector<int>adj[nmax];
int n,m,s,dest;
inline void citire()
{
    scanf("%d%d%d%d",&n,&m,&s,&dest);
    for(;m>0;--m)
    {
        int x,y,ct,z;
        scanf("%d%d%d%d",&x,&y,&ct,&z);
        adj[x].pb(y);
        adj[y].pb(x);
        c[x][y]+=ct;
        d[x][y]+=z;
        d[y][x]-=z;
    }
}
int bellman()
{
    for(int i=1;i<=n;i++)
    {
        dist[i]=INF;
        upd[i]=0;
        vis[i]=0;
        t[i]=0;
    }
    q.push(s);
    vis[s]=1;
    dist[s]=0;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        vis[nod]=0;
        for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
        {
            if(c[nod][*it]-f[nod][*it]<=0) continue;
            if(dist[*it]>dist[nod]+d[nod][*it])
            {
                dist[*it]=dist[nod]+d[nod][*it];
                t[*it]=nod;
                upd[*it]++;
                if(upd[*it]==n) return (!(dist[dest]==INF));
                if(!vis[*it])
                {
                    vis[*it]=1;
                    q.push(*it);
                }
            }
        }
    }
    if(dist[dest]==INF) return 0;
    return 1;
}
inline void do_flow()
{
    int flow=0,cost=0;
    for(int fmin=INF;bellman();)
    {
        int sumt=0;
        for(int nod=dest;nod!=s;nod=t[nod])
        {
            sumt+=d[t[nod]][nod];
            fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
        }
        cost+=dist[dest]*fmin;
        flow+=fmin;
        for(int nod=dest;nod!=s;nod=t[nod])
        {
            f[t[nod]][nod]+=fmin;
            f[nod][t[nod]]-=fmin;
        }
    }
    printf("%d\n",cost);
}
int main()
{
    freopen ("fmcm.in","r",stdin);
    freopen ("fmcm.out","w",stdout);
    citire();
    do_flow();
}