Pagini recente » Cod sursa (job #1666752) | Cod sursa (job #1035231) | Cod sursa (job #3285737) | Cod sursa (job #134330) | Cod sursa (job #758384)
Cod sursa(job #758384)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define N_MAX 355
#define INF 2000000000
#define FOR(i, v) for(typeof(v.begin()) i = v.begin(); i != v.end(); i++)
queue<int> Q;
vector<int> G[N_MAX];
int C[N_MAX][N_MAX], F[N_MAX][N_MAX], cost[N_MAX][N_MAX];
int Dist[N_MAX];
int T[N_MAX];
bool in[N_MAX];
int n, m, S, D;
int notStop = 1;
void vecini(int x) {
FOR(i, G[x]) {
if(F[x][*i] == C[x][*i]) continue;
if(Dist[*i] > Dist[x] + cost[x][*i]) {
Dist[*i] = Dist[x] + cost[x][*i];
T[*i] = x;
if(!in[*i]) Q.push(*i);
in[*i] = 1;
}
}
}
int BellmanFord() {
Q.push(S);
in[S] = 1;
for(int i = 1; i <= n; i++) {
Dist[i] = INF;
}
Dist[S] = 0;
while(!Q.empty()) {
int x = Q.front();
Q.pop();
in[x] = 0;
vecini(x);
}
if(Dist[D] == INF) return 0;
notStop = 1;
int fl = INF;
for(int x = D; x != S; x = T[x]) {
fl = min(fl, C[T[x]][x] - F[T[x]][x]);
}
for(int x = D; x != S; x = T[x]) {
F[T[x]][x] += fl;
F[x][T[x]] -= fl;
}
return Dist[D] * fl;
}
void solve() {
int c = 0;
while(notStop) {
notStop = 0;
c += BellmanFord();
}
printf("%d\n", c);
}
void add_muchie(int x, int y, int cap, int co) {
G[x].push_back(y);
C[x][y] = cap;
cost[x][y] = co;
G[y].push_back(x);
cost[y][x] = -co;
}
int main() {
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d%d%d%d", &n, &m, &S, &D);
for(int i = 1; i <= m; i++) {
int x,y,cap,co;
scanf("%d%d%d%d", &x, &y, &cap, &co);
add_muchie(x,y,cap,co);
}
solve();
return 0;
}