Pagini recente » Cod sursa (job #1814238) | Cod sursa (job #2968691) | Cod sursa (job #782056) | Cod sursa (job #1784589) | Cod sursa (job #1557288)
/*
Flux maxim de cost minim intr-o retea de transport
Complexitate:O(N2*M2) pentru 50 de pct
D. Liviu
*/
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
#include <queue>
#include <cstring>
#define NMax 510
#define INFINIT 0x3f3f3f3f3f
using namespace std;
vector<int> Graf[NMax];
int N,M,S,D,Cap[NMax][NMax],Flux[NMax][NMax],Cost[NMax][NMax];
int tata[NMax],Dis[NMax],C[NMax],sol,x,y,z,cap,CostMin;
deque<int> Q;
bool mark[NMax];
void Read()
{
scanf("%d%d%d%d",&N,&M,&S,&D);
for(int i=1;i<=M;i++)
{
scanf("%d%d%d%d",&x,&y,&cap,&z);
Graf[x].push_back(y);
Graf[y].push_back(x);
Cap[x][y]=cap;
Cost[x][y]=z;Cost[y][x]=-z;
}
}
inline bool Bellman(int nodStart)
{
Q.push_back(nodStart);
memset(C,0,sizeof(C));memset(tata,0,sizeof(tata));memset(Dis,INFINIT,sizeof(Dis));
Dis[nodStart]=0,C[nodStart]=1;
while(Q.empty()==false)
{
int nod=Q.front();
Q.pop_front();
C[nod]=0;
for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
if (Dis[*it]>Dis[nod]+Cost[nod][*it] && Cap[nod][*it]>0)
{
tata[*it]=nod;
Dis[*it]=Dis[nod]+Cost[nod][*it];
if(!C[*it])
Q.push_back(*it);
}
}
return tata[D]!=0;
}
void Edmonds_Karp()
{
while(Bellman(S))
{
int MaxFlow=INFINIT;
for(int nod=D;tata[nod];nod=tata[nod])
MaxFlow=(MaxFlow>Cap[tata[nod]][nod]?Cap[tata[nod]][nod]:MaxFlow);
for(int nod=D;tata[nod];nod=tata[nod])
{
Cap[tata[nod]][nod]=Cap[tata[nod]][nod]-MaxFlow;
Cap[nod][tata[nod]]=Cap[nod][tata[nod]]+MaxFlow;
Flux[tata[nod]][nod]=Flux[tata[nod]][nod]+MaxFlow;
CostMin=CostMin+Cost[tata[nod]][nod]*MaxFlow;
}
}
printf("%d",CostMin);
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
Read();
Edmonds_Karp();
}