Pagini recente » Cod sursa (job #2736363) | Cod sursa (job #2932937) | Cod sursa (job #3148360) | Cod sursa (job #28908) | Cod sursa (job #297782)
Cod sursa(job #297782)
#include <stdio.h>
#define Lg 355
#define infinit 60000000LL
using namespace std;
struct nod
{
int inf;
nod *next;
}*sir[Lg];
int cap[Lg][Lg],cost[Lg][Lg];
int n,m,S,D,rez,inc,sf,Cost_aux;
int Q[Lg*Lg],viz[Lg],tati[Lg],Cost[Lg];
int minim(int a,int b)
{
return a>b?b:a;
}
void adauga(int a,int b)
{
nod *q=new nod;
q->inf=b;
q->next=sir[a];
sir[a]=q;
}
void citire()
{
freopen ("fmcm.in","r",stdin);
freopen ("fmcm.out","w",stdout);
int x,y,c,cos;
scanf ("%d %d %d %d",&n,&m,&S,&D);
for (int i=0;i<m;i++)
{
scanf ("%d %d %d %d",&x,&y,&c,&cos);
adauga(x,y);
adauga(y,x);
cap[x][y]=c;
cost[x][y]=cos;
cost[y][x]=-cos;
}
}
void bell_BMW()
{
for (int i=1;i<=n;i++)
{
Cost[i]=infinit;
tati[i]=-1;
}
inc=0;
sf=1;
Q[inc]=S;
Cost[S]=0;
viz[S]=1;
while (inc<sf)
{
int N=Q[inc];
viz[N]=0;
inc++;
Cost_aux=Cost[N];
for (nod *q=sir[N];q;q=q->next)
if (cap[N][q->inf] && Cost[q->inf]>Cost_aux+cost[N][q->inf])
{
Cost[q->inf]=Cost_aux+cost[N][q->inf];
tati[q->inf]=N;
if (!viz[q->inf])
{
viz[q->inf]=1;
Q[sf++]=q->inf;
}
}
}
}
void fmcm()
{
int flux,poz;
bell_BMW();
while (Cost[D]!=infinit)
{
flux=infinit;
poz=D;
while (poz!=S)
{
flux=minim(flux,cap[tati[poz]][poz]);
poz=tati[poz];
}
poz=D;
while (poz!=S)
{
cap[tati[poz]][poz]-=flux;
cap[poz][tati[poz]]+=flux;
poz=tati[poz];
}
rez+=flux*Cost[D];
bell_BMW();
}
}
int main ()
{
citire();
fmcm();
printf("%d\n",rez);
return 0;
}