Cod sursa(job #2396915)

Utilizator PredaBossPreda Andrei PredaBoss Data 3 aprilie 2019 22:33:45
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,inc,sf,x,y,cap,val;
int ans;
vector<int>nod[355];
int c[355][355],cst[355][355];
int mn_cst[355];
int aux[355];
int dist[355];
int father[355];
bool inq[355];
priority_queue<pii,vector<pii>,greater<pii> >pq;
bool dijkstra()
{
    for(int i=1;i<=n;i++)
        dist[i]=INT_MAX;
    dist[inc]=0;
    aux[inc]=0;
    pq.push({dist[inc],inc});
    while(!pq.empty())
    {
        int d=pq.top().first;
        int pos=pq.top().second;
        pq.pop();
        if(dist[pos]<d)continue;
        for(int i=0;i<nod[pos].size();i++)
        {
            if(c[pos][nod[pos][i]]==0)continue;
            if(dist[nod[pos][i]]<=d+cst[pos][nod[pos][i]]+mn_cst[pos]-mn_cst[nod[pos][i]])continue;
            dist[nod[pos][i]]=d+cst[pos][nod[pos][i]]+mn_cst[pos]-mn_cst[nod[pos][i]];
            aux[nod[pos][i]]=aux[pos]+cst[pos][nod[pos][i]];
            father[nod[pos][i]]=pos;
            pq.push({dist[nod[pos][i]],nod[pos][i]});
        }
    }
    memcpy(mn_cst,aux,sizeof(dist));
    if(dist[sf]==INT_MAX)
        return false;
    int mn=INT_MAX;
    int cur_cst=0;
    for(int i=sf;i!=inc;i=father[i])
        mn=min(mn,c[father[i]][i]);
    ans+=mn*aux[sf];
    for(int i=sf;i!=inc;i=father[i])
    {
        c[father[i]][i]-=mn;
        c[i][father[i]]+=mn;
    }
    return true;
}
void ford()
{
    for(int i=1;i<=n;i++)
        mn_cst[i]=INT_MAX;
    mn_cst[inc]=0;
    queue<int>q;
    q.push(inc);
    while(!q.empty())
    {
        int pos=q.front();
        q.pop();
        inq[pos]=false;
        for(int i=0;i<nod[pos].size();i++)
            if(c[pos][nod[pos][i]])
            {
                if(mn_cst[nod[pos][i]]<=mn_cst[pos]+cst[pos][nod[pos][i]])continue;
                mn_cst[nod[pos][i]]=mn_cst[pos]+cst[pos][nod[pos][i]];
                if(inq[nod[pos][i]])continue;
                inq[nod[pos][i]]=true;
                q.push(nod[pos][i]);
            }
    }
}
int main()
{
    fin>>n>>m>>inc>>sf;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>cap>>val;
        nod[x].push_back(y);
        nod[y].push_back(x);
        c[x][y]=cap;
        cst[x][y]=val;
        cst[y][x]=-val;
    }
    ford();
    while(dijkstra());
    fout<<ans;
    return 0;
}