Pagini recente » Cod sursa (job #451069) | Cod sursa (job #2591763) | Cod sursa (job #1771659) | Cod sursa (job #2149048) | Cod sursa (job #780880)
Cod sursa(job #780880)
#include<cstdio>
#include<list>
#include<queue>
using namespace std;
const int inf=99999999;
int N,M,S,D,i,j,x,y,cap,ct,p,q,flowmin,exista_drum;
list<int> L[351];
list<int>::iterator it;
int cost[351][351],c[351][351],flux[351][351],t[351];
int dist[351];
queue<int> Q;
int BellmanFord()
{for(i=1; i<=N; i++)
{dist[i]=inf;
t[i]=-1;}
dist[S]=0;
Q.push(S);
while(!Q.empty())
{p=Q.front();
Q.pop();
for(it=L[p].begin(); it!=L[p].end(); it++)
{q=*it;
if(c[p][q]-flux[p][q]>0 && cost[p][q]+dist[p]<dist[q])
{dist[q]=cost[p][q]+dist[p];
t[q]=p;
Q.push(q);}
}
}
if(dist[D]!=inf)
{j=D;
flowmin=inf;
exista_drum=1;
while(j!=S)
{i=t[j];
if(flowmin>c[i][j]-flux[i][j])
flowmin=c[i][j]-flux[i][j];
j=t[j];}
j=D;
while(j!=S)
{i=t[j];
flux[i][j]+=flowmin;
flux[j][i]-=flowmin;
j=t[j];}
return flowmin*dist[D];
}
return 0;
}
long long Flux()
{long long rezultat=0;
exista_drum=1;
int nr=10;
while(exista_drum)
{exista_drum=0;
rezultat+=BellmanFord();
nr--;}
return rezultat;}
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 ",&x,&y,&cap,&ct);
L[x].push_back(y);
L[y].push_back(x);
c[x][y] = cap;
cost[x][y] = ct;
cost[y][x] = -ct;}
//BellmanFord();
/*for(i=1; i<=N; i++)
printf("%d ",dist[i]);
printf("\n\n\n");
for(i=1; i<=N; i++)
{for(j=1; j<=N; j++)
printf("%d ",cost[i][j]);
printf("\n");} */
printf("%lld", Flux());
return 0;}