Pagini recente » Cod sursa (job #1282950) | Cod sursa (job #526764) | Cod sursa (job #608891) | Cod sursa (job #2009168) | Cod sursa (job #1563791)
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 999999999
using namespace std;
int n,m,x,y,c,i,j,cp,Min,s,d,nod,sol;
int dist[NMAX],tata[NMAX],viz[NMAX];
int flux[NMAX][NMAX],cap[NMAX][NMAX],cost[NMAX][NMAX];
vector<int>v[NMAX];
queue<int>q;
int BF()
{
int i,x,y,c;
for(i=1; i<=n; ++i)
{
dist[i]=INF;
tata[i]=0;viz[i]=0;
}
q.push(s);dist[s]=0;
while(!q.empty())
{
x=q.front();
q.pop();
viz[x]=0;
for(i=0; i<v[x].size(); ++i)
{
y=v[x][i];
c=cost[x][y];
if (cap[x][y] > flux[x][y] && dist[y] > dist[x] + c)
{
dist[y]=dist[x]+c;
tata[y]=x;
if(!viz[y])
{
viz[y]=1;
q.push(y);
}
}
}
}
if (tata[d]) return 1;
else 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",&x,&y,&cp,&c);
v[x].push_back(y);
v[y].push_back(x);
cap[x][y]=cp;
cost[x][y]=c;cost[y][x]=-c;
}
while(BF())
{
Min=INF;
for(nod=d; nod!=s; nod=tata[nod])
Min=min(Min,cap[tata[nod]][nod] - flux[tata[nod]][nod]);
for(nod=d; nod!=s; nod=tata[nod])
{
flux[tata[nod]][nod] += Min;
flux[nod][tata[nod]] -= Min;
}
sol += dist[d] * Min;
}
printf("%d\n",sol);
return 0;
}