Pagini recente » Cod sursa (job #266080) | Cod sursa (job #1790290) | Cod sursa (job #2258871) | Cod sursa (job #2329336) | Cod sursa (job #327815)
Cod sursa(job #327815)
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define maxn 353
#define maxm 12500
#define inf 2147000000
#define pb push_back
long n, i, j, k, m, s, d, a, b, ca, cs, sol, ok, l, nod, fiu, tata;
long cost;
long c[maxn][maxn], f[maxn][maxn];
vector<long> v[maxn], w[maxn];
long coa[maxn*maxm], t[maxn], fol[maxn], dist[maxn];
long bf()
{
long sol;
memset(t, 0, sizeof(t));
memset(fol, 0, sizeof(fol));
for(i=1; i<=n; i++)
{
dist[i]=inf;
}
dist[s]=0;
l=1;
coa[l]=s;
fol[s]=1;
for(i=1; i<=l; i++)
{
nod=coa[i];
for(j=0; j<v[nod].size(); j++)
{
fiu=v[nod][j];
cs=w[nod][j];
if((c[nod][fiu]-f[nod][fiu]>0) && dist[nod]+cs<dist[fiu])
{
t[fiu]=nod;
dist[fiu]=dist[nod]+cs;
if(fol[fiu]==0)
{
fol[fiu]=1;
coa[++l]=fiu;
}
}
}
fol[nod]=0;
}
if(dist[d]!=inf)
{
sol=inf;
nod=d;
while(nod!=s)
{
tata=t[nod];
if(sol>c[tata][nod]-f[tata][nod])
{
sol=c[tata][nod]-f[tata][nod];
}
nod=tata;
}
nod=d;
while(nod!=s)
{
tata=t[nod];
f[tata][nod]+=sol;
f[nod][tata]-=sol;
nod=tata;
}
ok=1;
return sol*dist[d];
}
return 0;
}
int main()
{
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d%d%d%d", &n, &m, &s, &d);
for(i=1; i<=m; i++)
{
scanf("%d%d%d%d", &a, &b, &ca, &cs);
v[a].pb(b);
v[b].pb(a);
c[a][b]=ca;
c[b][a]=0;
w[a].pb(cs);
w[b].pb(-cs);
}
ok=1;
while(ok)
{
ok=0;
cost+=bf();
}
printf("%d\n", cost);
return 0;
}