Pagini recente » Cod sursa (job #868845) | Cod sursa (job #1952772) | Cod sursa (job #1265153) | Cod sursa (job #1372205) | Cod sursa (job #1435645)
#include <cstdio>
#include <vector>
#include <queue>
#define Nmax 355
#define INF 2000000000
using namespace std;
int n,Cost[Nmax][Nmax],C[Nmax][Nmax],F[Nmax][Nmax],S,D,prv[Nmax],dp[Nmax];
bool viz[Nmax];
queue <int> Q;
vector <int> L[Nmax];
inline bool Bellman()
{
int i,nod;
viz[S]=true; Q.push(S);
for(i=1;i<=n;++i)
{
dp[i]=INF;
prv[i]=0;
}
dp[S]=0;
while(!Q.empty())
{
nod=Q.front(); Q.pop(); viz[nod]=false;
for(auto it : L[nod])
if(F[nod][it]<C[nod][it] && dp[it]>dp[nod]+Cost[nod][it])
{
dp[it]=dp[nod]+Cost[nod][it];
prv[it]=nod;
if(viz[it]) continue;
Q.push(it); viz[it]=true;
}
}
return (dp[D]!=INF);
}
int main()
{
int m,x,y,c,z,maxflow=0,mincost=0;
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d", &n,&m,&S,&D);
while(m--)
{
scanf("%d%d%d%d", &x,&y,&c,&z);
C[x][y]=c; Cost[x][y]=z; Cost[y][x]=-z;
L[x].push_back(y); L[y].push_back(x);
}
while(Bellman())
{
int sum=0,minim=INF;
for(x=D;x!=S;x=prv[x])
{
sum+=Cost[prv[x]][x];
minim=min(minim,C[prv[x]][x]-F[prv[x]][x]);
}
for(x=D;x!=S;x=prv[x])
{
F[prv[x]][x]+=minim;
F[x][prv[x]]-=minim;
}
maxflow+=minim;
mincost+=sum*minim;
}
printf("%d\n", mincost);
return 0;
}