Pagini recente » Cod sursa (job #1645217) | Monitorul de evaluare | Cod sursa (job #781284) | Cod sursa (job #650060) | Cod sursa (job #1576548)
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
#define INF 9999999999
#define Nmax 353
int N,M,Cost[Nmax][Nmax],C[Nmax][Nmax],F[Nmax][Nmax],T[Nmax],S,D,flux=0,drum=0,c=0;
bool U[Nmax];
struct lista{int nod; lista *leg;} *G[Nmax];
void adaug(int i,int j)
{
lista *p;
p=new lista;
p->nod=j;
p->leg=G[i];
G[i]=p;
}
void citire()
{
f>>N>>M>>S>>D;
int i,j,c,z;
while(M--)
{
f>>i>>j>>c>>z;
adaug(i,j);
adaug(j,i);
C[i][j]=c;
Cost[i][j]=z;
Cost[j][i]=-z;
}
}
int BF(int S,int D)
{
int p,u,nod,Q[5*Nmax],Dist[Nmax];
lista *q;
// memset(T,0,sizeof T);
for(int i=1;i<=N;++i) Dist[i]=INF;
memset(U,0,sizeof U);
p=u=1;
Q[p]=S; T[S]=-1; T[D]=0; Dist[S]=0;
while(p<=u)
{
int nod=Q[p];
for(q=G[nod];q;q=q->leg)
if(C[nod][q->nod]>F[nod][q->nod]&&Dist[q->nod]>Dist[nod]+Cost[nod][q->nod])
{
Dist[q->nod]=Dist[nod]+Cost[nod][q->nod];
T[q->nod]=nod;
if(!U[q->nod]) // daca nu se afla deja in coada
{
u++; Q[u]=q->nod; U[q->nod]=1;
}
}
U[nod]=0; // se scoata din coada elementul curent
p++;
}
if(T[D]) {c=Dist[D]; return 1;}
else return 0;
}
void flow(int S,int D)
{
int i,r;
for(flux=0,drum=0;BF(S,D);flux+=r,drum+=r*c)
{
i=D; r=INF;
while(i-S)
{
r=min(r,C[T[i]][i]-F[T[i]][i]);
i=T[i];
}
i=D;
while(i-S)
{
F[T[i]][i]+=r;
F[i][T[i]]-=r;
i=T[i];
}
}
}
int main()
{
citire();
flow(S,D);
g<<drum<<'\n';
return 0;
}