Pagini recente » Cod sursa (job #691510) | Cod sursa (job #212505) | Cod sursa (job #712616) | Cod sursa (job #29017) | Cod sursa (job #789105)
Cod sursa(job #789105)
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
#define Max 351
#define Inf 0xffffff
vector<int>g[Max];
set<int>s0,s1;
int n,s,d,c[Max][Max],f[Max][Max],p[Max][Max],t[Max],dst[Max];
bool bfs()
{
int x,y;
for(int i=1;i<=n;i++)dst[i]=Inf;
dst[s]=0;
s0.insert(s);
for(int k=1;k<=n;k++)
{
while(s0.size()>0)
{
x=*s0.begin();
s0.erase(s0.begin());
for(int i=0;i<g[x].size();i++)
{
y=g[x][i];
if(dst[y]>dst[x]+p[x][y] && c[x][y] > f[x][y])
{
dst[y]=dst[x]+p[x][y];
t[y]=x;
s1.insert(y);
}
}
}
swap(s0,s1);
}
return dst[d]!=Inf;
}
void maxflow()
{
int fmcm=0,flux;
while(bfs())
{
flux=Inf;
for(int x=d;x!=s;x=t[x])flux=min(flux,c[t[x]][x]-f[t[x]][x]);
if(flux!=0)
for(int x=d;x!=s;x=t[x])
{
f[t[x]][x]+=flux;
f[x][t[x]]-=flux;
fmcm+=flux*p[t[x]][x];
}
}
printf("%d\n",fmcm);
}
int main()
{
int m,x,y,z,w;
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,&z,&w);
g[x].push_back(y);
g[y].push_back(x);
c[x][y]=z;
p[x][y]=w;
p[y][x]=-w;
}
maxflow();
return 0;
}