Pagini recente » Cod sursa (job #238899) | Cod sursa (job #296339)
Cod sursa(job #296339)
#include <fstream.h>
unsigned long int r[1001][1001], flux = 0;
int bf[1001], sel[1001], st,dr,ant[1001];
int n,m,i,a,b,cost, drum[1001];
int indice;
long int minim = 1000000;
int main()
{
ifstream f("maxflow.in");
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>a>>b>>cost;
r[a][b]=cost;
}
f.close();
int gasit = 0;
int nod = 0;
do
{
gasit = 0;
//bf
for (i=1;i<=n;i++)
{
bf[i] = 0;
sel[i] = 0;
ant[i] = 0;
}
st=0;
dr=1;
bf[dr]=1;
sel[1]=1;
ant[1]=0;
while(st<=dr)
{
st++;
nod = bf[st];
for(i=1;i<=n;i++)
if(r[nod][i] && !sel[i])
{
dr++;
bf[dr] = i;
sel[i] = 1;
ant[i] = nod;
if(i == n)
gasit = 1;
}
}
//reconstituirea drumului
if(gasit)
{
for(i=1; i<=n; i++)
drum[i] = 0;
drum[1] = n;
indice = 1;
nod = drum[indice];
while(ant[nod])
{
indice ++;
drum[indice] = ant[nod];
nod = ant[nod];
}
//minimul
minim = 1000000;
for (i=1; i<indice; i++)
if(r[drum[i+1]][drum[i]] < minim)
minim = r[drum[i+1]][drum[i]];
for(i=1; i< indice; i++)
{
r[drum[i+1]][drum[i]] -= minim;
r[drum[i]][drum[i+1]] += minim;
}
flux += minim;
}//if gasit
}while(gasit);
ofstream g("maxflow.out");
g<<flux<<'\n';
g.close();
return 0;
}