Cod sursa(job #2962588)

Utilizator Iordache_AnaIordache Ana-Georgiana Iordache_Ana Data 8 ianuarie 2023 19:33:08
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n, m, nod1, nod2, maxf,nod,i;
vector<vector<int>>l_ad;
vector<int>tata, viz, dist;
int cap[351][351], cost[351][351],a,b,c,d;
queue<int>que;
int bellman_ford(){
    viz.assign(n+1, 0);
    dist.assign(n+1, INT_MAX);
    while(!que.empty())
        que.pop();
    que.push(nod1);
    viz[nod1] = 1;
    tata[nod1] = nod1;
    dist[nod1] = 0;
    while(!que.empty()){
        int nod = que.front();
        que.pop();
        viz[nod] = 0;
        for(auto vecin: l_ad[nod]){
            if(cap[nod][vecin] > 0 && dist[vecin] > dist[nod] + cost[nod][vecin]){
                dist[vecin] = dist[nod] + cost[nod][vecin];
                tata[vecin] = nod;
                if(!viz[vecin]){
                    que.push(vecin);
                    viz[vecin] = 1;}}}}
    return dist[nod2];
}
int main() {
    f>>n>>m>>nod1>>nod2;
    l_ad.reserve(n+1);
    tata.assign(n+1, 0);
    for(i=0; i<m; i++){
        f>>a>>b>>c>>d;
        l_ad[a].push_back(b);
        l_ad[b].push_back(a);
        cap[a][b]= c;
        cost[a][b]=d;
        cost[b][a]=-d;
    }
    while(true){
        int total = bellman_ford();
        if(total == INT_MAX)
            break;
        int flow = INT_MAX;
        for(nod = nod2; nod != nod1; nod = tata[nod]) {
            flow = min(flow, cap[tata[nod]][nod]);
        }
        for(nod = nod2; nod != nod1; nod = tata[nod]) {
            cap[tata[nod]][nod] -= flow;
            cap[nod][tata[nod]] += flow;
        }
        maxf += flow * total;
    }
    g<<maxf;
    return 0;
}