Cod sursa(job #3153227)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 28 septembrie 2023 17:25:03
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1001;

int n, m, s, d;
int parent[NMAX];
vector<vector<pair<int, int>>> g;
int cap[NMAX][NMAX], dist[NMAX];
bool in_queue[NMAX];

void bfs(int start) {
	queue<int> q;
	q.push(start);
	fill(dist, dist+n, INT_MAX);
	dist[start] = 0;
	in_queue[start] = 1;
	while(!q.empty()) {
		int node = q.front();
		q.pop();
		for(auto [son, cost] : g[node]) {
			int w = cap[node][son];
			if(w <= 0 || dist[node] + cost >= dist[son]) continue ;
			dist[son] = dist[node] + cost;
			parent[son] = node;
			if(!in_queue[son]) { q.push(son); }
			in_queue[son] = 1;
		}
		in_queue[node] = 0;
	}
}

int flow(int source, int sink) {
	bool STOP = false;
	int cost = 0;
	while(!STOP) {
		memset(parent, -1, sizeof(parent));
		STOP = true;
		bfs(source);
		if(parent[sink] != -1) { 
			STOP = false;
			int node = sink, curr_flow = INT_MAX; 
			while(node != source) {
				curr_flow = min(curr_flow, cap[parent[node]][node]);
				node = parent[node];
			}
			node = sink;
			while(node != source) {
				cap[parent[node]][node] -= curr_flow;
				cap[node][parent[node]] += curr_flow;
				node = parent[node];
			}			
			cost += curr_flow * dist[sink];				
		}
	}
	return cost;
}

int main() {
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out", "w", stdout);
	scanf("%d %d %d %d", &n, &m, &s, &d);
	s--, d--;
	g.resize(n);
	for(int i = 0; i < m; i++) {
		int x, y, c, w;
		scanf("%d %d %d %d", &x, &y, &c, &w);
		x--, y--;
		g[x].push_back({y, w});
		g[y].push_back({x, -w});
		cap[x][y] = c;
	}

	printf("%d\n", flow(s, d));

	return 0;
}