Pagini recente » Cod sursa (job #299569) | Cod sursa (job #487159) | Cod sursa (job #1973690) | Cod sursa (job #807660) | Cod sursa (job #2469705)
#include <bits/stdc++.h>
#define DIM 353
#define inf 200000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
deque <int> q;
vector <int> L[DIM];
bitset<DIM> v;
int n,x,y,s,d,m,fsol,z,c,nod,vecin,cap[DIM][DIM],flux[DIM][DIM],i,fluxmin,t[DIM],cost[DIM][DIM],gasit,dist[DIM];
bool bf() {
v.reset();
for(i=1;i<=n;i++)
dist[i]=inf;
dist[s]=0, v[s]=1;
gasit=0;
q.clear();
q.push_back(s);
while(!q.empty()) {
nod=q.front();
q.pop_front();
v[nod]=0;
for(int 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]) {
dist[vecin] = dist[nod]+cost[nod][vecin];
t[vecin]=nod;
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()) {
nod=d;
fluxmin=inf;
while(nod!=s) {
fluxmin=min(fluxmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=d;
while(nod!=s) {
flux[t[nod]][nod] +=fluxmin;
flux[nod][t[nod]] -=fluxmin;
nod=t[nod];
}
fsol+=fluxmin*dist[d];
}
fout<<fsol<<"\n";
}