Pagini recente » Cod sursa (job #1376179) | Cod sursa (job #650205) | Cod sursa (job #2255922) | Cod sursa (job #280823) | Cod sursa (job #3153227)
#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;
}