Pagini recente » Statistici Maxim Alexandru (Aly-Alexandru) | Cod sursa (job #332743) | Monitorul de evaluare | Profil anio123 | Cod sursa (job #2469673)
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
#define DIM 352
#define inf 2000000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,i,x,y,s,d,c,z,sol,fmin,nod,vecin,t[DIM],cap[DIM][DIM],dist[DIM],flux[DIM][DIM],cost[DIM][DIM];
bitset<DIM> v;
deque<int> q;
vector<int> L[DIM];
bool bf() {
bool gasit=0;
v.reset();
q.clear();
for (i=1;i<=n;i++)
dist[i]=inf;
q.push_back(s);
v[s]=1, dist[s]=0;
while (!q.empty()) {
nod=q.front();
q.pop_front();
v[nod]=0;
for (i=0;i<L[nod].size();i++) {
vecin=L[nod][i];
if (cap[nod][vecin]>flux[nod][vecin]&&dist[vecin]>dist[nod]+cost[nod][vecin]) {
t[vecin]=nod;
dist[vecin]=dist[nod]+cost[nod][vecin];
if (!v[vecin]) {
q.push_back(vecin);
v[vecin]=1;
if (vecin==d)
gasit=1;
}
}
}
}
return gasit;
}
int main() {
fin>>n>>m>>s>>d;
for (i=1;i<=m;i++) {
fin>>x>>y>>z>>c;
L[x].push_back(y);
L[y].push_back(x);
cap[x][y]=z;
cost[x][y]=c;
cost[y][x]=-c;
}
while (bf()) {
fmin=inf;
for (nod=d;nod!=s;nod=t[nod])
fmin=min(fmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
for (nod=d;nod!=s;nod=t[nod]) {
flux[t[nod]][nod]+=fmin;
flux[nod][t[nod]]-=fmin;
}
sol+=fmin*dist[d];
}
fout<<sol;
return 0;
}