Pagini recente » Cod sursa (job #1442818) | Cod sursa (job #1280300) | Cod sursa (job #1280551) | Cod sursa (job #2610286) | Cod sursa (job #1748057)
#include <fstream>
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <set>
#include <algorithm>
#include <iomanip>
#include <string>
#define pb push_back
#define NMAX 355
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef pair<int, int> pii;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector<int> v[NMAX];
int cap[NMAX][NMAX], flux[NMAX][NMAX], cost[NMAX][NMAX], costmin[NMAX], p[NMAX];
bool viz[NMAX];
int main () {
int n,m,s,d,i,x,y,c,e,ok=1,fmin,sol=0;
fin>>n>>m>>s>>d;
for(i=0;i<m;++i) {
fin>>x>>y>>c>>e;
cap[x][y]=c;
cost[x][y]=e;
cost[y][x]=-e;
v[x].pb(y);
v[y].pb(x);
}
do {
for(i=1;i<=n;++i) costmin[i]=INF;
costmin[s]=0;
queue<int> Q;
Q.push(s);
viz[s]=1;
while(!Q.empty()) {
x=Q.front();
c=costmin[x];
Q.pop();
viz[x]=0;
for(auto y:v[x]) {
if(flux[x][y] < cap[x][y] && c+cost[x][y]<costmin[y]) {
costmin[y]=cost[x][y]+c;
p[y]=x;
if(!viz[y]) {
viz[y]=1;
Q.push(y);
}
}
}
}
if(costmin[d]==INF) ok=0;
if(ok) {
fmin=INF;
x=d;
while(x!=s) {
fmin=min(fmin,cap[p[x]][x]-flux[p[x]][x]);
x=p[x];
}
x=d;
while(x!=s) {
flux[p[x]][x]+=fmin;
flux[x][p[x]]-=fmin;
x=p[x];
}
sol+=fmin*costmin[d];
}
} while(ok);
fout<<sol;
return 0;
}