Pagini recente » Cod sursa (job #1434801) | Cod sursa (job #2159478) | Cod sursa (job #1972808) | Cod sursa (job #2223962) | Cod sursa (job #563192)
Cod sursa(job #563192)
#include<fstream.h>
#define infinit 32000
#define nmax 352
int n,m,a[nmax][nmax],b[nmax][nmax],cost[nmax][nmax],t[nmax],c[nmax],sw,s,f,min,d[nmax];
struct muchie
{int x,y,c;} e[25004];
void cit()
{//a[i][j] - matricea costurilor, cu a[i][j]=0 daca nu exista (i,j)
int i,j,k,c;
ifstream fin("fmcm.in");
fin>>n>>m;
fin>>s>>f;
for(k=1;k<=m;k++)
{
fin>>i>>j;
fin>>a[i][j]>>c;
e[k].x=i; e[k].y=j; e[k].c=c;
e[k+m].x=j; e[k+m].y=i; e[k+m].c=-c;
}
fin.close();
}
int bellman(int s,int f)
{//Se cauta un drum in crestere cu cost minim folosind alg Bellman-Ford
int i,j,k,l,sw,c;
for(i=1;i<=n;i++)
{t[i]=0;d[i]=infinit;}
d[s]=0;
sw=1;
for(k=1;k<=n-1&&sw==1;k++)//cat timp s-a efectuat cel putin o minimizare
{
sw=0;
for(l=1;l<=2*m;l++)
{
i=e[l].x;
j=e[l].y;
c=e[l].c;
if(d[i]+c<d[j]&&a[i][j]-b[i][j]>0)
{d[j]=d[i]+c;t[j]=i;sw=1;}
}
}
k=f;
while(k!=s&&k!=0)
k=t[k];
if(k==0)
return 0;
return 1;
}
void make_better(int nod)
{
/*functie recursiva care imbunatateste drumul in crestere gasit
si memorat su ajutorul vectorului de tati t; min= capacitatea reziduala*/
if(nod!=s)
{
if(a[t[nod]][nod]-b[t[nod]][nod]<min)
min=a[t[nod]][nod]-b[t[nod]][nod];
make_better(t[nod]);
b[t[nod]][nod]+=min;
b[nod][t[nod]]-=min;
}
}
void afis()
{
int i,rez=0;
ofstream fout("fmcm.out");
for(i=1;i<=m;i++)
rez+=e[i].c*b[e[i].x][e[i].y];
fout<<rez<<'\n';
fout.close();
}
int main()
{
cit();
while(bellman(s,f))
{
min=infinit;
make_better(f);
}
afis();
return 0;
}