Cod sursa(job #2735763)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 2 aprilie 2021 19:43:10
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;
#define SERVER 0
const string nameFile="fmcm";
ifstream in (nameFile+".in");
ofstream out(nameFile+".out");
typedef pair<int, int> Pii;
#if (SERVER)
    #define in cin
    #define out cout
#endif
const int nmax=350, mmax=12500;
const int oo=1e9;
int x, y, z, t, n, m, source, sink;
short cost[nmax+2][nmax+2];
short capacity[nmax+2][nmax+2];
vector <int> muchii[nmax+2];
int parent[nmax+2];
int dp[nmax+2];
bool inQ[nmax+2];
int costFin, flowFin;
bool bellmanFord(){
    queue <int> q;
    fill(parent+1, parent+n+1, -1);
    fill(dp+1, dp+n+1, oo);
    fill(inQ+1, inQ+n+1, false);
    dp[source]=0;
    parent[source]=-2;
    inQ[source]=true;
    q.push(source);

    while(!q.empty()){
        int nod=q.front();
        inQ[nod]=false;
        q.pop();
        for(auto &x:muchii[nod])
            if(capacity[nod][x] && dp[x]>dp[nod]+cost[nod][x]){
                parent[x]=nod, dp[x]=dp[nod]+cost[nod][x];
                if(x!=sink)
                    if(inQ[x]==false)
                        q.push(x), inQ[x]=true;
            }
    }
    return parent[sink]!=-1;
}
void flow(){
    while(bellmanFord()){
        int tt=dp[sink];
        int nodAct=sink;
        int flowAct=oo;
        while(nodAct!=source){
            flowAct=min(flowAct, 1*capacity[parent[nodAct]][nodAct]);
            nodAct=parent[nodAct];
        }
        nodAct=sink;
        while(nodAct!=source){
            capacity[parent[nodAct]][nodAct]-=flowAct;
            capacity[nodAct][parent[nodAct]]+=flowAct;
            nodAct=parent[nodAct];
        }
        flowFin+=flowAct;
        costFin+=flowAct*dp[sink];
    }
}
int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    in>>n>>m>>source>>sink;
    for(int i=1; i<=m; i++){
        in>>x>>y>>z>>t;
        cost[x][y]=t;
        cost[y][x]=-t;
        muchii[x].push_back(y);
        muchii[y].push_back(x);
        capacity[x][y]=z;
    }
    flow();
    out<<costFin<<"\n";
    return 0;
}