Pagini recente » Cod sursa (job #2722950) | Cod sursa (job #1579812) | Cod sursa (job #1521451) | Cod sursa (job #678644) | Cod sursa (job #649075)
Cod sursa(job #649075)
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
const int N = 351;
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 bf() {
vector<int>::iterator it;
queue<int> q;
int i;
for(i=1;i<=n;++i) {
fol[i]=false;
p[i]=0;
dist[i]=1<<25;
}
q.push(s);
fol[s]=true;
dist[s]=0;
while(!q.empty()) {
for(it=v[q.front()].begin() ; it!=v[q.front()].end() ; ++it)
if(c[q.front()][*it] - f[q.front()][*it] > 0 && dist[*it] > dist[q.front()] + cos[q.front()][*it]) {
dist[*it] = dist[q.front()] + cos[q.front()][*it];
p[*it]=q.front();
if(!fol[*it]) {
fol[*it]=true;
q.push(*it);
}
}
fol[q.front()]=false;
q.pop();
}
if(dist[d]!=(1<<25)) {
drum=1;
int vmin=1<<25;
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;
}
int cflux() {
int 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);
c[a][b]=cap;
cos[a][b]=cost;
cos[b][a]=-cost;
}
out << cflux();
return 0;
}