Pagini recente » Cod sursa (job #1961433) | Cod sursa (job #296930) | Cod sursa (job #2596492) | Cod sursa (job #1505148) | Cod sursa (job #1182270)
#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
const int N = 351;
const int INF = 2000000000;
int n, m, s, d;
vector<int> v[N];
int cost[N][N], flux[N][N], cap[N][N];
bool ver, ve[N];
int dist[N], p[N];
int bf() {
queue<int> q;
int i;
for(i = 0; i < N; ++i) {
dist[i] = INF;
ve[i] = 0;
}
q.push(s);
ve[s] = 1;
dist[s] = 0;
while(!q.empty()) {
int el = q.front();
q.pop();
ve[el] = 0;
for(vector<int>::iterator it = v[el].begin(); it != v[el].end(); ++it)
if(cap[el][*it] - flux[el][*it] > 0 && dist[*it] > dist[el] + cost[el][*it]) {
dist[*it] = dist[el] + cost[el][*it];
if(!ve[*it]) {
ve[*it] = 1;
q.push(*it);
}
p[*it] = el;
}
}
if(dist[d] != INF) {
ver = 1;
int smin = INF;
for(i = d; i != s; i = p[i])
smin = min(smin, cap[p[i]][i] - flux[p[i]][i]);
for(i = d; i != s; i = p[i]) {
flux[p[i]][i] += smin;
flux[i][p[i]] -= smin;
}
return smin * dist[d];
}
return 0;
}
int cmin() {
ver = 1;
int rez = 0;
while(ver) {
ver = 0;
rez += bf();
}
return rez;
}
int main() {
int i;
in >> n >> m >> s >> d;
for(i = 1; i <= m; ++i) {
int a, b, c, d;
in >> a >> b >> c >> d;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b] = c;
cost[a][b] = d;
cost[b][a] = -d;
}
out << cmin();
return 0;
}