Pagini recente » Cod sursa (job #2251420) | Cod sursa (job #1426572) | Cod sursa (job #581411) | Cod sursa (job #916961) | Cod sursa (job #309090)
Cod sursa(job #309090)
#include<fstream.h>
int cap[1001][1001],fx[1001][1001],fluxm;
short x,y,z,q[1001],s[1001],t[1001],N,M;
int min(int x,int y){return x<y?x:y;}
struct nod
{short inf;nod* adr;}*G[1001];//listele de adiacenta ale grafului
void push(nod *&l,int x)
{nod *p=new nod;p->inf=x;p->adr=l;l=p;}
short bfs()
{short l=1,i;//l - lungimea cozii
q[1]=1;//coada pentru bfs
memset(s,0,sizeof(s));s[1] = 1;//vizitat
for(i=1;i<=l;++i)
if(q[i]!=N)
for(nod*p=G[q[i]];p;p=p->adr)
if(cap[q[i]][p->inf]!=fx[q[i]][p->inf]&&!s[p->inf])
{s[p->inf]=1;
q[++l]=p->inf;
t[p->inf]=q[i];}//t - tata, vector pentru memorarea drumului
return s[N];}
int main()
{ifstream f("maxflow.in");ofstream g("maxflow.out");
f>>N>>M;
while(M--)
{f>>x>>y>>z;
cap[x][y]=z;//capacitatea muchiei
push(G[x],y);
push(G[y],x);}
while(bfs())
for(nod *p=G[N];p;p=p->adr)
if(fx[p->inf][N]!=cap[p->inf][N]&&s[p->inf])
{t[N]=p->inf;
int fm=999999999;
for(x=N;x!=1;x=t[x])
fm=min(fm,cap[t[x]][x]-fx[t[x]][x]);
if(fm)
for(x=N;x!=1;x=t[x])
{fx[t[x]][x]+=fm;
fx[x][t[x]]-=fm;}
fluxm+=fm;}
g<<fluxm;
return 0;
}