Cod sursa(job #2187883)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 26 martie 2018 19:49:56
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int N,M,S,D,cap[360][360],cost[360][360],flux[360][360],vDist[360],vTati[360];
vector <int> G[360];
priority_queue <pair<int,int> > pq;
bool dij()
{
    memset(vDist,0x3f3f3f3f,sizeof(vDist));
    memset(vTati,0,sizeof(vTati));
    pq.push({0,S});
    vTati[S]=S;
    vDist[S]=0;
    int dist,nod;
    while(!pq.empty())
    {
        nod=pq.top().second;
        pq.pop();
        if(nod==D)
            continue;
        for(auto fiu:G[nod])
        {
            if(vDist[fiu]>vDist[nod]+cost[nod][fiu]&&
                    cap[nod][fiu]>flux[nod][fiu])
            {
                vTati[fiu]=nod;
                vDist[fiu]=vDist[nod]+cost[nod][fiu];
                pq.push({-vDist[fiu],fiu});
            }
        }
    }
    return vDist[D]!=0x3f3f3f3f;
}
int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&N,&M,&S,&D);
    int nod1,nod2,c1,c2,rasp=0;
    for(int i=1; i<=M; i++)
    {
        scanf("%d%d%d%d",&nod1,&nod2,&c1,&c2);
        G[nod1].push_back(nod2);
        G[nod2].push_back(nod1);
        cap[nod1][nod2]=c1;
        cost[nod1][nod2]=c2;
        cost[nod2][nod1]=-c2;
    }
    while(dij())
    {
        int f=0x3f3f3f3f;
        for(int nod=D; nod!=S; nod=vTati[nod])
        {
            f=min(f,cap[vTati[nod]][nod]-flux[vTati[nod]][nod]);
        }
        for(int nod=D; nod!=S; nod=vTati[nod])
        {
            flux[vTati[nod]][nod]+=f;
            flux[nod][vTati[nod]]-=f;
        }
        rasp+=f*vDist[D];
    }
    printf("%d",rasp);
    return 0;
}