Pagini recente » Cod sursa (job #1464925) | Cod sursa (job #3157265) | Cod sursa (job #2884643) | Cod sursa (job #239747) | Cod sursa (job #567832)
Cod sursa(job #567832)
#include <cstdio>
#include <cstring>
#define MaxN 355
#define MAX 1000005
#define Inf 2000000000
#define infile "fmcm.in"
#define outfile "fmcm.out"
struct edge{
int x;
edge *next;
} *G[MaxN];
int cap[MaxN][MaxN],cost[MaxN][MaxN],b[MaxN][MaxN];
int t[MaxN],Q[MAX],uz[MaxN];
int N,M,S,D,sw=1,min;
long long CT,dist[MaxN];
void add(int x,int y)
{
edge *q=new edge;
q->x=y; q->next=G[x]; G[x]=q;
}
void read()
{
int i,x,y,c,z;
scanf("%d%d%d%d",&N,&M,&S,&D);
for(i=1;i<=M;i++)
{
scanf("%d%d%d%d",&x,&y,&c,&z);
add(x,y); add(y,x);
cap[x][y]=c; cost[x][y]=z;
cost[y][x]=-z;
}
}
void BF()
{
int i,p=1;
edge *q;
for(i=1;i<=N;i++)
dist[i]=Inf, t[i]=-1;
sw=0;
dist[S]=0;
/*while(ok)
{
ok=0;
for(i=1;i<=N;i++)
for(q=G[i];q;q=q->next)
if(cap[i][q->x]-b[i][q->x]>0 && dist[i]+cost[i][q->x]<dist[q->x])
{
dist[q->x]=dist[i]+cost[i][q->x];
t[q->x]=i;
ok=1;
}
}*/
Q[p]=S; uz[S]=1;
for(i=1;i<=p;i++)
{
for(q=G[Q[i]];q;q=q->next)
if(cap[Q[i]][q->x]-b[Q[i]][q->x]>0 && dist[Q[i]]+cost[Q[i]][q->x]<dist[q->x])
{
dist[q->x]=dist[Q[i]]+cost[Q[i]][q->x];
t[q->x]=Q[i];
if(!uz[q->x])
{
Q[++p]=q->x;
uz[q->x]=1;
}
}
uz[Q[i]]=0;
}
if(dist[D]!=Inf)
sw=1;
}
void imbun(int nod)
{
if(nod!=S)
{
if(cap[t[nod]][nod]-b[t[nod]][nod]<min)
min=cap[t[nod]][nod]-b[t[nod]][nod];
imbun(t[nod]);
b[t[nod]][nod]+=min;
b[nod][t[nod]]-=min;
CT+=(long long)(cost[t[nod]][nod]*min);
}
}
void solve()
{
do{
BF();
min=Inf;
if(sw)
imbun(D);
}while(sw);
}
void write()
{
printf("%lld\n",CT);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}