Cod sursa(job #1377315)

Utilizator dica69Alexandru Lincan dica69 Data 5 martie 2015 21:10:04
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define Nmax 351
#define INF 999999999

using namespace std;
FILE *f1,*f2;
int h[Nmax],pos[Nmax],old_d[Nmax],use[Nmax],d[Nmax],nc,rd[Nmax],t[Nmax],F,Fcst,Min;
queue <int> q;
int n,m,u,v,cost,cap,C[Nmax][Nmax],Cst[Nmax][Nmax],S,D,i,k;
vector <int> a[Nmax];

void swap(int i,int j)
{int aux;
aux=h[i];h[i]=h[j];h[j]=aux;
pos[h[i]]=i;pos[h[j]]=j;
}

void push(int x)
{while (x/2 && d[h[x/2]]>d[h[x]])
{swap(x,x/2);
x=x/2;
}
}

void pop(int x)
{int y=0;
while (x!=y)
{y=x;
if (y*2<=k && d[h[y*2]]<d[h[x]]) x=2*y;
if (y*2+1<=k && d[h[y*2+1]]<d[h[x]]) x=2*y+1;
swap(x,y);
}
}

int extract()
{int v=h[1];
pos[v]=0;
h[1]=h[k--];
pop(1);
return v;
}


void bellman()
{int nod;
memset(old_d,0x3f,(n+1)*4);
old_d[S]=0;q.push(S);use[S]=1;
while (!q.empty())
{nod=q.front();q.pop();use[nod]=0;
for (i=0;i<(int)a[nod].size();i++)
if (C[nod][a[nod][i]])
if (old_d[a[nod][i]]>old_d[nod]+Cst[nod][a[nod][i]])
{old_d[a[nod][i]]=old_d[nod]+Cst[nod][a[nod][i]];
if (!use[a[nod][i]])
{q.push(a[nod][i]);
use[a[nod][i]]=1;
}
}
}
}

int dijkstra()
{int nod;
memset(pos,0,sizeof(pos));
for (i=1;i<=n;i++) d[i]=INF;
k=1;h[k]=S;pos[S]=k;rd[S]=0;
d[S]=0;
while (k)
{nod=extract();
for (i=0;i<(int)a[nod].size();i++)
if (C[nod][a[nod][i]])
{nc=Cst[nod][a[nod][i]]+old_d[nod]-old_d[a[nod][i]];
if (d[a[nod][i]]>d[nod]+nc)
{d[a[nod][i]]=d[nod]+nc;
rd[a[nod][i]]=rd[nod]+Cst[nod][a[nod][i]];
t[a[nod][i]]=nod;
if (pos[a[nod][i]]==0) {h[++k]=a[nod][i];pos[a[nod][i]]=k;}
push(pos[a[nod][i]]);
}
}
}
memcpy(old_d,rd,sizeof(rd));
if (d[D]==INF) return 0;
Min=INF;
nod=D;
while (nod!=S)
{if (C[t[nod]][nod]<Min) Min=C[t[nod]][nod];
nod=t[nod];
}
F+=Min;
Fcst+=Min*rd[D];
nod=D;
while (nod!=S)
{C[t[nod]][nod]-=Min;
C[nod][t[nod]]+=Min;
nod=t[nod];
}
return 1;
}

int main()
{f1 = fopen("fmcm.in","r");
f2 = fopen("fmcm.out","w");
fscanf(f1,"%d %d %d %d",&n,&m,&S,&D);
for (i=1;i<=m;i++)
{fscanf(f1,"%d %d %d %d",&u,&v,&cap,&cost);a[u].push_back(v);
C[u][v]=cap;Cst[u][v]=cost;a[v].push_back(u);Cst[v][u]=-cost;}

bellman();
while (dijkstra());

fprintf(f2,"%d\n",Fcst);

fclose(f1);
fclose(f2);
    return 0;
}

//Challenges are what make life interesting and overcoming them is what makes life meaningful.