Cod sursa(job #2960394)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 4 ianuarie 2023 11:50:16
Problema Flux maxim de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
#include<cstring>
using namespace std;

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");


const int NMAX = 351;
const int INF = 1e9;

int cap[NMAX][NMAX],flow[NMAX][NMAX],cost[NMAX][NMAX];

bool finished;

vector<int> vecini[NMAX];

int t[NMAX],n;

bitset<NMAX> inq;

long long ans;

void bf(int s,int d)
{
    finished = 1;
    vector<int> dp(NMAX,INF);
    dp[s] = 0; queue<int> q;
    q.push(s);

    inq.reset(); inq[s] = 1;
    memset(t,0,sizeof(t));

    while(!q.empty())
        {
            int v = q.front(); q.pop();
            inq[v] = 0;
            for(auto it : vecini[v])
                {
                    if((cap[v][it] - flow[v][it]) <= 0)
                        continue;

                    if((dp[v] + cost[v][it]) < dp[it])
                        {
                            t[it] = v;
                            dp[it] = dp[v] + cost[v][it];
                            if(!inq[it])
                                {
                                    q.push(it);
                                    inq[it] = 1;
                                }
                        }
                }
        }


    if(dp[d] == INF)
        return ;

    finished = 0;

    int r = INF;
    for(int nod = d; nod != s; nod = t[nod])
            r = min(r,cap[t[nod]][nod] - flow[t[nod]][nod]);


    for(int nod = d; nod != s; nod = t[nod])
        {
            flow[t[nod]][nod] += r;
            flow[nod][t[nod]] -= r;
        }

    ans += 1LL * r * dp[d];
}

void wannabe(int s,int d)
{
    ///vreau un drum de cost minim folosind doar muchii de augmentare

    bf(s,d);

    while(!finished)
        {
            bf(s,d);
        }

    fout << ans;
    exit(0);
}


int main()
{


    int a,b,s,d,c,m,z; fin >> n >> m >> s >> d;
    for(int i = 1; i <= m ; i++)
        {
            fin >> a >> b >> c >> z;
            vecini[a].emplace_back(b);
            cap[a][b] = c;
            cost[a][b] = z;
            cost[b][a] = -z;
        }

    wannabe(s,d);

}