Pagini recente » Cod sursa (job #1860734) | Cod sursa (job #943715) | Cod sursa (job #3134575) | Cod sursa (job #868826) | Cod sursa (job #1509286)
#include<stdio.h>
#include<vector>
#include<iostream>
#include<utility>
using namespace std;
int x,y,z,t,M;
#define inf 1000000000
int S,D,flux,N,rez,d[400],c[400][400],v[400][400],f[400][400],p[400];
int q[160000],first,last;
vector<int> m[400];
bool viz[400],inq[400];
inline void add(int x) {
if(inq[x]) return;
inq[x] = viz[x] = 1;
q[last++] = x;
}
inline int pop() {
int x = q[first++];
inq[x] = 0;
return x;
}
inline void reset_stuff() {
first = last = 0;
for(int i = 1; i <= N; ++i) {
viz[i] = inq[i] = 0;
d[i] = 1000000000;
}
d[S] = 0;
}
inline bool bfs() {
reset_stuff();
add(S);
while(first < last) {
int x = pop();
if(x==D) continue;
for(int i = 0; i < m[x].size(); ++i) {
int y = m[x][i];
if(f[x][y] < c[x][y] && d[y] > d[x] + v[x][y]) {
add(y); p[y] = x;
d[y] = d[x] + v[x][y];
}
}
}
return viz[D];
}
void update() {
flux = inf;
int curr = D;
while(curr!=S) {
if(c[p[curr]][curr] - f[p[curr]][curr] < flux) {
flux = c[p[curr]][curr] - f[p[curr]][curr];
}
if(!flux) break;
curr = p[curr];
}
curr = D;
while(curr!=S) {
f[p[curr]][curr] += flux;
f[curr][p[curr]] -= flux;
curr = p[curr];
}
rez += d[D]*flux;
}
void flow() {
while(true) {
if(!bfs()) break;
update();
}
}
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) {
scanf("%d%d%d%d",&x,&y,&z,&t);
m[x].push_back(y);
m[y].push_back(x);
c[x][y] = z;
v[x][y] = t;
v[y][x] = -t;
}
flow();
printf("%d",rez);
return 0;
}