Pagini recente » Cod sursa (job #2863224) | Cod sursa (job #2432492) | Cod sursa (job #2503569) | Cod sursa (job #1122805) | Cod sursa (job #442966)
Cod sursa(job #442966)
#include <stdio.h>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define NMAX 355
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
#define INF 2000000000
vector <int> G[NMAX];
set <int> q;
int C[NMAX][NMAX], F[NMAX][NMAX], cost[NMAX][NMAX];
int D[NMAX], in[NMAX], T[NMAX];
int n, m, s, d, ok;
void relax(int x){
FOR(i, G[x])
if(C[x][*i] - F[x][*i]>0 && D[*i] > D[x] + cost[x][*i]){
D[*i] = D[x] + cost[x][*i];
T[*i] = x;
if(!in[*i]) q.insert(*i);
in[*i] = 1;
}
}
int bf(){
for(int i = 1; i <= n; ++i){
D[i] = INF;
in[i] = 0;
}
q.insert(s);
D[s] = 0;
while(!q.empty()){
int nod = *q.begin();
q.erase(nod);
in[nod] = 0;
if(nod == d) continue;
relax(nod);
}
if(D[d] == INF) return 0;
ok = 1;
int flux = INF;
for(int x = d; x != s; x = T[x])
flux = min(flux, C[T[x]][x] - F[T[x]][x]);
for(int x = d; x != s; x = T[x]){
F[T[x]][x] += flux;
F[x][T[x]] -= flux;
}
return D[d] * flux;
}
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, z, c;
scanf("%d%d%d%d",&x, &y, &z, &c);
G[x].push_back(y); G[y].push_back(x);
C[x][y] = z;
cost[y][x] = -(cost[x][y] = c);
}
ok = 1;
int sol = 0;
while(ok){
ok = 0;
sol += bf();
}
printf("%d\n", sol);
return 0;
}