Cod sursa(job #2960271)

Utilizator Tudose_StefanTudose Alexandru Stefan Tudose_Stefan Data 3 ianuarie 2023 22:28:58
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxx = 351, mmaxx = (int)(1e9);
int cty[maxx][maxx], tata[maxx], cost[maxx][maxx];
vector <int> dist(maxx);
vector <vector<int>> adjL;
bitset <maxx> viz(false);
int n, m, i, nr1, nr2, nr3, flow, minn, j, start, endd, nr4;

int bellford(){
	queue <int> q;
	q.push(start);
	viz.reset();
	dist.assign(n+1, mmaxx);
	dist[start] = 0;
	while(!q.empty()){
		nr1 = q.front();
		q.pop();
		viz[nr1]=false;
		for(auto &i : adjL[nr1]){
			if (cty[nr1][i] > 0 && dist[i] > dist[nr1] + cost[nr1][i]){
                dist[i] = dist[nr1] + cost[nr1][i];
                tata[i] = nr1;
                if (viz[i] == false){
                    viz[i] = true;
                    q.push(i);
                }
			}
		}
	}
	return dist[endd];
}


int main(){
  	fin >>n >> m >> start >> endd;
  	adjL.assign(n+1, vector<int>());
  	for(i = 0; i < m; ++i){
  		fin >> nr1 >> nr2 >> nr3 >> nr4;
  		adjL[nr1].push_back(nr2);
  		adjL[nr2].push_back(nr1);
  		cty[nr1][nr2] = nr3;
  		cost[nr1][nr2] = nr4;
  		cost[nr2][nr1] = -nr4;
  	}
  	flow = 0;
  	while(true){                        /// nr1 -> dist totala pana in destinatie
        nr1 = bellford();
        if (nr1 == mmaxx)
            break;
        minn = maxx;
        for (i = endd; i != start; i = tata[i]){
            minn = min(minn, cty[tata[i]][i]);
        }
        for (i = endd; i != start; i = tata[i]){
            cty[tata[i]][i] -= minn;
            cty[i][tata[i]] += minn;
        }
        flow += minn * nr1;
  	}
  	fout << flow << '\n';
	return 0;
}