Pagini recente » Cod sursa (job #1838785) | Cod sursa (job #508899) | Cod sursa (job #2770827) | Cod sursa (job #53435) | Cod sursa (job #2469642)
#include <iostream>
#include <fstream>
#include <bitset>
#include <deque>
#include <vector>
#define DIM 360
using namespace std;
ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
bitset <400> viz;
vector<int> L[DIM];
deque<int> q;
int n,i,vecin,x,y,s,d,m,c,z,nod,minim,cost,flux;
int Z[DIM][DIM],C[DIM][DIM],F[DIM][DIM],D[DIM],T[DIM];
int bell(){
int gasit=0;
viz.reset();
q.clear();
q.push_back(s);
viz[s]=1;
for(i=1;i<=n;i++)
D[i]=1000000000;
D[s]=0;
while(!q.empty()){
x=q.front();
q.pop_front();
viz[x]=0;
for(i=0;i<L[x].size();i++){
if(C[x][L[x][i]] > F[x][L[x][i]]){
y=L[x][i];
if(D[y]>D[x]+Z[x][y]){
D[y]=D[x]+Z[x][y];
T[y]=x;
if(viz[vecin]==0) {
q.push_back(y);
viz[y]=1;
}
if(y==d)
gasit=1;
}
}
}
}
return gasit;
}
int main(){
fin>>n>>m>>s>>d;
for(i=1;i<=m;i++){
fin>>x>>y>>c>>z;
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=c;
Z[x][y]=z;
Z[y][x]=-z;
}
while(bell()){
nod=d;
minim=200000000;
while(nod!=s){
minim=min(minim,C[T[nod]][nod]-F[T[nod]][nod]);
nod=T[nod];
}
nod=d;
while(nod!=s){
F[T[nod]][nod]+=minim;
F[nod][T[nod]]-=minim;
cost+=minim*Z[T[nod]][nod];
nod=T[nod];
}
flux+=minim;
}
fout<<cost;
return 0;
}