Pagini recente » Cod sursa (job #1887005) | Cod sursa (job #1830868) | Cod sursa (job #2354746) | Cod sursa (job #1474559) | Cod sursa (job #809848)
Cod sursa(job #809848)
#include<iostream>
#include<fstream>
using namespace std;
const int NMAX = 1001;
struct NOD {
int info;
NOD *urm;
};
typedef NOD* PNOD;
int c[NMAX][NMAX],cd[NMAX],viz[NMAX],p[NMAX],n;
PNOD v[NMAX];
PNOD nou(int info)
{
PNOD p;
p=new NOD;
p->info=info;
p->urm=NULL;
return p;
}
void adaugare(PNOD &p, int x)
{
PNOD aux;
aux=nou(x);
aux->urm=p;
p=aux;
}
int bfs()
{
int i,nod,st,dr;
for(i=1;i<=n;i++)
viz[i]=0;
cd[1]=1;
viz[1]=1;
st=1;
dr=1;
while(st<=dr) {
nod=cd[st];
st++;
for(PNOD aux=v[nod];aux!=NULL;aux=aux->urm)
if(viz[aux->info]==0 && c[nod][aux->info]>=1) {
viz[aux->info]=1;
cd[++dr]=aux->info;
p[aux->info]=nod;
if(aux->info==n)
return 1;
}
}
return 0;
}
void citire()
{
int m,i,x,y,capacity;
ifstream f("maxflow.in");
f>>n>>m;
for(i=1;i<=n;i++)
v[i]=NULL;
for(i=1;i<=m;i++) {
f>>x>>y>>capacity;
adaugare(v[x],y);
adaugare(v[y],x);
c[x][y]=capacity;
}
f.close();
}
int edmonds_karp()
{
int fluxcurent,fluxmax,nod;
for(fluxmax=0 ; bfs(); fluxmax=fluxmax+fluxcurent) {
fluxcurent=(1<<30);
for(nod=n;nod!=1;nod=p[nod])
fluxcurent=min(fluxcurent,c[p[nod]][nod]);
for(nod=n;nod!=1;nod=p[nod]) {
c[p[nod]][nod]=c[p[nod]][nod]-fluxcurent;
c[nod][p[nod]]=c[nod][p[nod]]+fluxcurent;
}
}
return fluxmax;
}
int main ()
{
ofstream g("maxflow.out");
citire();
g<<edmonds_karp();
g.close();
return 0;
}