Pagini recente » Cod sursa (job #2640931) | Cod sursa (job #1294008) | Cod sursa (job #1247825) | Cod sursa (job #1838893) | Cod sursa (job #2469842)
#include <bits/stdc++.h>
#define inf 10000000
#define dim 353
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,nod,vec,i,j,c[dim][dim],flux[dim][dim],z[dim][dim],s,d,sol,C,Z;
vector <short> l[dim];
short t[dim];
bool ok,f[dim];
int D[dim];
deque <short> q;
bool bell(){
memset(f,0,sizeof(f));
for(i = 1; i <= n; i++)
D[i] = inf;
D[s] = 0;
q.push_back(s);
ok = 0;
while(!q.empty()){
nod=q.front();
q.pop_front();
f[nod]=0;
if(nod==d)
ok = 1;
for(i=0;i<l[nod].size();i++){
vec = l[nod][i];
if(c[nod][vec]>flux[nod][vec] && D[vec]>D[nod]+z[nod][vec]){
D[vec] = D[nod] + z[nod][vec];
t[vec] = nod;
if(!f[vec]){
f[vec] = 1;
q.push_back(vec);
}
}
}
}
return ok;
}
int main(){
fin>>n>>m>>s>>d;
for(;m;m--){
fin>>i>>j>>C>>Z;
c[i][j] = C;
z[i][j] = Z;
z[j][i] = -Z;
l[i].push_back(j);
l[j].push_back(i);
}
while(bell()){
nod=d;
m=2*inf;
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;
}