Pagini recente » Cod sursa (job #2875295) | Cod sursa (job #2630074) | Cod sursa (job #148591) | Cod sursa (job #352881) | Cod sursa (job #2469472)
#include <iostream>
#include <fstream>
#include <bitset>
#include <deque>
#include <vector>
#define DIM 360
using namespace std;
ifstream fin ("a.in");
ofstream fout ("a.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;
for(i=1;i<=n;i++)
viz[i]=0;
viz.reset();
q.push_back(s);
viz[s]=1;
for(i=2;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[L[x][i]] > F[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;
nod=T[nod];
cost+=minim*Z[T[nod]][nod];
}
flux+=minim;
}
fout<<cost;
return 0;
}
///neterminata