Cod sursa(job #2697812)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 19 ianuarie 2021 18:16:54
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.52 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int N,M,S,D,C[355][355],Cst[355][355],F,FCst,in[355];
vector<int> con[355];
char inQ[355];
const int INF=0x3f3f3f3f;
int d[355],real_d[355],p[355];
int old_d[355];
queue<int> Q;
priority_queue< pair<int,int>, vector<pair< int,int> >, greater<pair<int,int>> > H;
bool dijkstra()
{
    memset(d,0x3f,sizeof(d));
    d[S]=0;
    real_d[S]=0;
    H.push(make_pair(d[S],S));
    while(!H.empty())
    {
        int cst=H.top().first, nod=H.top().second;
        H.pop();
        if(d[nod]!=cst)
            continue;
        vector<int>::iterator it;
        for(it=con[nod].begin();it!=con[nod].end();it++)
            if(C[nod][*it])
            {
                int new_d = d[nod]+Cst[nod][*it]+old_d[nod]-old_d[*it];
                if(new_d<d[*it])
                {
                    d[*it]=new_d;
                    real_d[*it]=real_d[nod]+Cst[nod][*it];
                    p[*it]=nod;
                    H.push(make_pair(d[*it],*it));
                }
            }
    }
    memcpy(old_d,real_d,sizeof(d));
    if(d[D]==0x3f3f3f3f)
        return false;
    int Min=0x3f3f3f3f,curCst=0;
    for(int aux=D;aux!=S;aux=p[aux])
    {
        Min=min(Min,C[p[aux]][aux]);
        curCst+=Cst[p[aux]][aux];
    }

    F+=Min;
    FCst+=Min*real_d[D];
    for(int aux=D;aux!=S;aux=p[aux])
    {
        C[p[aux]][aux]-=Min;
        C[aux][p[aux]]+=Min;
    }
    return true;
}
bool bellmanFord()
{
    memset(old_d, 0x3f, sizeof(old_d));
    old_d[S]=0;
    for(Q.push(S),in[S]=1; !Q.empty(); Q.pop())
    {
        vector<int>::iterator it;
        int i = Q.front();
        inQ[i]=0;
        for(it=con[i].begin();it!=con[i].end();it++)
            if(C[i][*it])
            {
                if(old_d[i]+Cst[i][*it]>=old_d[*it])
                    continue;

                old_d[*it]=old_d[i]+Cst[i][*it];
                if(inQ[*it])
                    continue;
                inQ[*it]=1;
                Q.push(*it);
            }
    }
    if(old_d[D]==0x3f3f3f3f)
        return 0;
    return 1;
}
int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    fin>>N>>M>>S>>D;
    while(M--)
    {
        int x,y;
        fin>>x>>y;
        con[x].push_back(y);
        con[y].push_back(x);
        fin>>C[x][y]>>Cst[x][y];
        Cst[y][x]=-Cst[x][y];
    }
    bellmanFord();
    while(dijkstra());
    fout<<FCst;
    return 0;
}