Pagini recente » Cod sursa (job #2112123) | Cod sursa (job #503070) | Cod sursa (job #1195150) | Cod sursa (job #1262077) | Cod sursa (job #1266329)
#include <fstream>
#include <list>
#include <queue>
#include <bitset>
#define DIM 361
#define INF 2000000011
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int N,M,X,Y,minim;
int D[DIM],T[DIM];
int F[DIM][DIM],C[DIM][DIM],CT[DIM][DIM];
long long sol;
list<int> L[DIM];
queue<int> q;
bitset<DIM> viz;
int bellmanford(){
list<int>::iterator it;
register int i,nod;
viz.reset();
q.push(X);
viz[X]=1;
for(i=1;i<=N;i++) D[i]=INF,T[i]=-1;
D[X]=0;
while(!q.empty()){
nod=q.front(),q.pop(),viz[nod]=0;
for(it=L[nod].begin();it!=L[nod].end();it++){
if(C[nod][*it]>F[nod][*it] && D[nod]+CT[nod][*it]<D[*it]){
D[*it]=D[nod]+CT[nod][*it];
T[*it]=nod;
if(!viz[*it]) viz[*it]=1,q.push(*it);
}
}
}
if(D[Y]!=INF)
return 1;
return 0;
}
int main(void){
register int i,j,x,y,z,c;
f>>N>>M>>X>>Y;
for(i=1;i<=M;i++){
f>>x>>y>>c>>z;
C[x][y]=c;
CT[x][y]=z;
CT[y][x]=-z;
L[x].push_back(y);
L[y].push_back(x);
}
while(bellmanford()){
x=Y;
minim=INF;
while(T[x]>0) minim=min(minim,C[T[x]][x]-F[T[x]][x]),x=T[x];
x=Y;
while(T[x]>0){
F[T[x]][x]+=minim;
F[x][T[x]]-=minim;
x=T[x];
}
sol+=minim*D[Y];
}
g<<sol;
f.close();
g.close();
return 0;
}