Pagini recente » Cod sursa (job #1988622) | Cod sursa (job #3179118) | Cod sursa (job #143256) | Cod sursa (job #2314815) | Cod sursa (job #410758)
Cod sursa(job #410758)
#include<fstream.h>
#define infinit 32000
#define nmax 1002
int n,a[nmax][nmax],b[nmax][nmax],t[nmax],c[nmax],sw,s,f,min;
void cit()
{//a[i][j] - matricea costurilor, cu a[i][j]=0 daca nu exista (i,j)
int i,j,m;
ifstream fin("maxflow.in");
fin>>n>>m;
s=1; f=n;
while(m--)
fin>>i>>j>>a[i][j];
fin.close();
}
void gasire_drum()
{//Se cauta un drum in crestere cu un nr minim de arce, parcurgand graful in latime(BF)
//c-coada iar t- vectorul tata cu t[i]=0 daca i este nevizitat
int p,u,nodc,i;
p=u=1; c[u]=s;
sw=0;//Pp ca nu a fost introdus in coada nodul f
while(p<=u&&sw==0)
{
nodc=c[p];
for(i=1;i<=n&&sw==0;i++)
if(a[nodc][i]-b[nodc][i]>0&&t[i]==0)
{
t[i]=nodc;
u++; c[u]=i;
}
else
if(b[i][nodc]>0&&t[i]==0&&i!=s)
{
t[i]=-nodc;
u++; c[u]=i;
}
p++;
if(c[p]==f)
sw=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(t[nod]>0)
{
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;
}
else
{
if(b[nod][abs(t[nod])]<min)
min=b[nod][abs(t[nod])];
make_better(abs(t[nod]));
b[nod][abs(t[nod])]-=min;
}
}
void afis()
{
int i,j;
ofstream fout("maxflow.out");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
fout<<b[i][j]<<" ";
fout<<'\n';
}
fout.close();
}
int main()
{
cit();
do
{
for(int i=1;i<=n;i++)
t[i]=0;
gasire_drum();
if(sw==1)
{
min=infinit;
make_better(f);
}
}while(sw==1);
afis();
return 0;
}