Cod sursa(job #2189732)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 28 martie 2018 21:31:19
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include <cstdio>
#include <set>
#include <queue>
#include <vector>
#include <cstring>
#define pb push_back
using namespace std;
const int nmax=1055;
int dist[nmax][nmax],c[nmax][nmax],f[nmax][nmax],bmf[nmax],d2[nmax],q[1000+nmax],vis[nmax],t[nmax],reald[nmax];
vector<int>adj[nmax];
int n,m,s,d;
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > >dj;
inline void citire()
{
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(int i=1;i<=m;i++)
    {
        int x,y,cr,z;
        scanf("%d%d%d%d",&x,&y,&cr,&z);
        adj[x].pb(y);
        adj[y].pb(x);
        dist[x][y]=z;
        dist[y][x]=-z;
        c[x][y]=cr;
    }
}
inline void bellman()
{
    for(int i=1;i<=n;i++) bmf[i]=100000000;
    bmf[s]=0;
    q[++q[0]]=s;
    vis[s]=1;
    for(int i=1;i<=q[0];i++)
    {
        int nod=q[i];
        vis[nod]=0;
        for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
        {
            if(!c[nod][*it]) continue;
            if(bmf[*it]>bmf[nod]+dist[nod][*it])
            {
                bmf[*it]=bmf[nod]+dist[nod][*it];
                if(vis[*it]) continue;
                vis[*it]=1;
                q[++q[0]]=*it;
            }
        }
    }
}
int dijkstra()
{
    for(int i=1;i<=n;i++)
    {
        d2[i]=0x3f3f3f3f;
        t[i]=-1;
    }
    d2[s]=0;
    dj.push(make_pair(0,s));
    while(!dj.empty())
    {
        int nod=dj.top().second,drr=dj.top().first;
        dj.pop();
        if(nod==d||d2[nod]!=drr) continue;
        for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
        {
            if(c[nod][*it]-f[nod][*it]<=0) continue;
            if(d2[*it]>drr+dist[nod][*it]+bmf[nod]-bmf[*it])
            {
                d2[*it]=drr+dist[nod][*it]+bmf[nod]-bmf[*it];
                dj.push(make_pair(d2[*it],*it));
                t[*it]=nod;
                reald[*it]=reald[nod]+dist[nod][*it];
            }
        }
    }
    memcpy(bmf,reald,sizeof(reald));
    if(d2[d]==0x3f3f3f3f) return 0;
    return 1;
}
int main()
{
    freopen ("fmcm.in","r",stdin);
    freopen ("fmcm.out","w",stdout);
    citire();
    bellman();
    int maxflow=0,minc=0;
    while(dijkstra())
    {
        int minim=0x3f3f3f3f;
        for(int i=d;i!=s;i=t[i]) minim=min(minim,c[t[i]][i]-f[t[i]][i]);
        maxflow+=minim;
        minc+=minim*reald[d];
        for(int i=d;i!=s;i=t[i])
        {
            f[t[i]][i]+=minim;
            f[i][t[i]]-=minim;
        }
    }
    printf("%d\n",minc);
}