Pagini recente » Cod sursa (job #1760780) | Cod sursa (job #125832) | Cod sursa (job #402643) | Cod sursa (job #1358569) | Cod sursa (job #2469839)
#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];
short cnt[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<cnt[nod];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); cnt[i]++;
l[j].push_back(i); cnt[j]++;
}
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;
}