Cod sursa(job #2016553)

Utilizator danstefanDamian Dan Stefan danstefan Data 29 august 2017 17:30:15
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int f[360][360],n,m,s,d,i,x,y,ca,co,c[360][360],cst[360][360],tata[360],ans[360],flux,cost_flux,ans2[360],nou[360];
bool ap[360];
vector<int>g[360];
bool bellman()
{
    memset(ap,0,sizeof(ap));
    memset(ans,inf,sizeof(ans));
    memset(tata,-1,sizeof(tata));
    queue<int>q;
    ap[s]=true;
    q.push(s);
    ans[s]=0;
    while(!q.empty())
    {
        int node=q.front();
        ap[node]=false;
        q.pop();
        for(auto &it:g[node])
        {
            if(f[node][it]<c[node][it]&&ans[it]>ans[node]+cst[node][it])
            {
                if(!ap[it])ap[it]=true,q.push(it);
                ans[it]=ans[node]+cst[node][it];
                tata[it]=node;
            }
        }
    }
    if(ans[d]!=inf)return true;
    return false;
}
bool dijkstra()
{
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >pq;
    pq.push({0,s});
    memset(ap,0,sizeof(ap));
    memset(ans2,inf,sizeof(ans2));
    nou[s]=0;
    ans2[s]=0;
    while(!pq.empty())
    {
        pair<int,int>X=pq.top();
        int cost=X.first;
        int node=X.second;
        pq.pop();
        if(ap[node])continue;
        ap[node]=true;
        for(auto&it:g[node])
            if(c[node][it]>f[node][it]&&ans2[it]>ans2[node]+cst[node][it]+ans[node]-ans[it])
            {
                tata[it]=node;
                nou[it]=nou[node]+cst[node][it];
                ans2[it]=ans2[node]+cst[node][it]+ans[node]-ans[it];
                pq.push({ans2[it],it});
            }
    }
    for(int i=0; i<=n; ++i)
        ans[i]=nou[i];
    if(ans2[d]!=inf)return true;
    return false;
}
void max_flow()
{
    bellman();
    while(dijkstra())
    {
        int node=d;
        int mi=inf;
        while(node!=s)
        {
            mi=min(mi,c[tata[node]][node]-f[tata[node]][node]);
            node=tata[node];
        }
        flux+=mi;
        cost_flux+=mi*ans[d];
        node=d;
        while(node!=s)
        {
            f[tata[node]][node]+=mi;
            f[node][tata[node]]-=mi;
            node=tata[node];
        }
    }
}
int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d%d",&x,&y,&ca,&co);
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y]=ca;
        cst[x][y]=co;
        cst[y][x]=-co;
    }
    max_flow();
    printf("%d\n",cost_flux);
    return 0;
}