Pagini recente » Cod sursa (job #302205) | Cod sursa (job #2987264) | Cod sursa (job #1130608) | Cod sursa (job #407123) | Cod sursa (job #1589370)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#define DIM 355
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int N, M, S, D, minim, Cost;
bitset <DIM> inQueue;
vector <int> v[DIM];
int C[DIM][DIM];
int F[DIM][DIM];
int cost[DIM][DIM];
int Di[DIM];
int T[DIM];
queue <int> Q;
int BF(){
for(int i=1;i<=N;i++)
Di[i] = 0x3f3f3f3f;
inQueue[S] = 1;
Di[S] = 0;
Q.push(S);
while(!Q.empty()){
int node = Q.front();
inQueue[node] = 0;
Q.pop();
for(std::vector <int>::iterator it=v[node].begin();it!=v[node].end();it++){
if(Di[*it] > Di[node] + cost[node][*it] && C[node][*it] > F[node][*it]){
Di[*it] = Di[node] + cost[node][*it];
T[*it] = node;
if(!inQueue[*it]){
inQueue[*it]=1;
Q.push(*it);
}
}
}
}
return Di[D] != 0x3f3f3f3f;
}
int main(){
fin >> N >> M >> S >> D;
while(M--){
int x,y,c,z;
fin >> x >> y >> c >> z;
v[x].push_back(y);
v[y].push_back(x);
C[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
while(BF()){
int u=D;
minim = 0x3f3f3f3f;
while(T[u]!=0){
if(minim > C[T[u]][u] - F[T[u]][u])
minim = C[T[u]][u] - F[T[u]][u];
u=T[u];
}
u=D;
while(T[u]!=0){
Cost += minim * cost[T[u]][u];
F[T[u]][u] += minim;
F[u][T[u]] -= minim;
u = T[u];
}
}
fout << Cost << "\n";
}