Pagini recente » Cod sursa (job #1835804) | Cod sursa (job #2383514) | Cod sursa (job #2520100) | Cod sursa (job #2300921) | Cod sursa (job #2469732)
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>
#include <climits>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,nod,vec,i,j,c[381][381],flux[381][381],z[381][381],s,d,sol,t[381],ok,C,Z;
vector <int> l[381];
bitset <381> f;
int D[381];
deque <int> q;
bool bell(){
f.reset();
for(i=1;i<=n;i++)
D[i]=1000000000;
D[s]=0;
f[s]=1;
q.push_back(s);
ok=0;
while(!q.empty()){
nod=q.front();
f[nod]=0;
q.pop_front();
for(i=0;i<l[nod].size();i++){
vec=l[nod][i];
if(D[vec]>D[nod]+z[nod][vec] && c[nod][vec]-flux[nod][vec]>0){
D[vec]=D[nod]+z[nod][vec];
t[vec]=nod;
if(f[vec]==0){
f[vec]=1;
q.push_back(vec);
if(vec==d)
ok=1;
}
}
}
}
return ok;
}
int main(){
fin>>n>>m>>s>>d;
for(;m;m--){
fin>>i>>j;
fin>>c[i][j]>>z[i][j];
z[j][i]=-z[i][j];
l[i].push_back(j);
l[j].push_back(i);
}
while(bell()){
nod=d;
m=1000000000;
while(nod!=s){
m=min(m,c[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=d;
while(nod!=s){
flux[t[nod]][nod]+=m;
flux[nod][t[nod]]-=m;
nod=t[nod];
}
sol+=m*D[d];
}
fout<<sol;
return 0;
}