Pagini recente » Cod sursa (job #1515549) | Cod sursa (job #105569) | Cod sursa (job #1034402) | Cod sursa (job #1663414) | Cod sursa (job #650025)
Cod sursa(job #650025)
#include<fstream>
#include<vector>
#include<stdio.h>
using namespace std;
const int N = 501;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
int n,m,s,d,f[N][N],c[N][N],cos[N][N],drum=1,p[N],dist[N];
bool fol[N];
vector<int> v[N];
int q[1000010],l,st;
int bf() {
vector<int>::iterator it;
int i;
st=l=1;
q[st]=s;
for(i=1;i<=n;++i) {
fol[i]=false;
p[i]=0;
dist[i]=2000000000;
}
fol[s]=true;
dist[s]=0;
while(st<=l) {
for(it=v[q[st]].begin() ; it!=v[q[st]].end() ; ++it)
if(c[q[st]][*it] - f[q[st]][*it] > 0 && dist[*it] > dist[q[st]] + cos[q[st]][*it]) {
dist[*it] = dist[q[st]] + cos[q[st]][*it];
p[*it]=q[st];
if(!fol[*it]) {
fol[*it]=true;
q[++l]=*it;
}
}
fol[q[st]]=false;
++st;
}
if(dist[d]!=2000000000) {
drum=1;
int vmin=2000000000;
for(i=d ; i!=s ; i=p[i])
if(c[p[i]][i] - f[p[i]][i]<vmin)
vmin = c[p[i]][i] - f[p[i]][i];
for(i=d ; i!=s ; i=p[i]) {
f[p[i]][i] += vmin;
f[i][p[i]] -= vmin;
}
return vmin * dist[d];
}
return 0;
}
inline long long cflux() {
long long cm=0;
while(drum) {
drum=0;
cm+=bf();
}
return cm;
}
int main() {
int i,a,b,cap,cost;
in >> n >> m >> s >> d;
for(i=1;i<=m;++i) {
in >> a >> b >> cap >> cost;
v[a].push_back(b);
v[b].push_back(a);
c[a][b]=cap;
cos[a][b]=cost;
cos[b][a]=-cost;
}
out << cflux();
return 0;
}