Pagini recente » Rating Verciuc Alex (AlexV28) | Cod sursa (job #2147207) | Cod sursa (job #557949) | Cod sursa (job #1844733) | Cod sursa (job #2245556)
#include <cstdio>
#include <bitset>
#include <deque>
#include <vector>
#define DIMN 351
#define DIMM 12501
#define INF 2000000000
using namespace std;
int dist[DIMN],tt[DIMN],n,s,d;
bitset <DIMN> f;
vector <int> v[DIMN];
deque <int> dq;
int c[DIMN][DIMN],cst[DIMN][DIMN],fl[DIMN][DIMN];
int bellmanford (){
int i,nod,vecin;
for (i=1;i<=n;i++){
dist[i]=INF;
tt[i]=0;
}
f.reset();
dq.push_back(s);
dist[s]=0;
f[s]=1;
while (dq.size()){
nod=dq.front();
// printf ("%d ",nod);
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (c[nod][vecin]>fl[nod][vecin] && dist[nod]+cst[nod][vecin]<dist[vecin]){
dist[vecin]=dist[nod]+cst[nod][vecin];
tt[vecin]=nod;
if (!f[vecin]) {// nu e in deque
f[vecin]=1;
dq.push_back(vecin);
}
}
}
f[nod]=0;
dq.pop_front();
}
if (dist[d]==INF)
return 0; /// nu se mai poate pune flux
return 1;
}
int main()
{
FILE *fin=fopen ("fmcm.in","r");
FILE *fout=fopen ("fmcm.out","w");
int m,i,x,y,cap,cost,sol,nod,vecin,mini;
fscanf (fin,"%d%d%d%d",&n,&m,&s,&d);
for (i=1;i<=m;i++){
fscanf (fin,"%d%d%d%d",&x,&y,&cap,&cost);
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=cap;
cst[x][y]=cost;
cst[y][x]=-cost;
}
sol=0;
while (bellmanford()){ /// cat timp mai introduc flux
vecin=d;
nod=tt[d];
mini=INF;
while (nod){
mini=min(mini,c[nod][vecin]-fl[nod][vecin]);
vecin=nod;
nod=tt[nod];
}
vecin=d;
nod=tt[d];
while (nod){
fl[nod][vecin]+=mini;
fl[vecin][nod]-=mini;
vecin=nod;
nod=tt[nod];
}
sol+= dist[d]*mini;
}
fprintf (fout,"%d",sol);
return 0;
}