Pagini recente » Cod sursa (job #2304378) | Cod sursa (job #3276555) | Cod sursa (job #3259107) | Cod sursa (job #3005724) | Cod sursa (job #475287)
Cod sursa(job #475287)
#include<fstream.h>
#define NMAX 1005
#include<queue>
#define inf 120000
using namespace std;
queue<long> q;
long flux,s,d,m,c[NMAX][NMAX],n,f[NMAX][NMAX],t[NMAX];
void cit()
{ifstream fin("maxflow.in");
fin>>n>>m;
long i,x,y,ct,nrs,nrd;
for(i=1;i<=m;++i)
{fin>>x>>y>>ct;c[x][y]=ct;}
for(x=1;x<=n;++x)
{nrs=0;
nrd=0;
for(y=1;y<=n;++y)
if(c[y][x])
++nrs;
else
if(c[x][y])
++nrd;
if(nrs==0)
s=x;
if(nrd==0)
d=x;
}
fin.close();
}
long bfs()
{long i,j,k;
while(!q.empty())
q.pop();
q.push(s);
for(i=1;i<=n;++i)
t[i]=0;
while(!q.empty())
{k=q.front();
for(i=1;i<=n;++i)
if(f[k][i]<c[k][i]&&t[i]==0)
{q.push(i);
t[i]=k;
if(i==d)
return 1;
}
q.pop();
}
return 0;
}
ofstream fout("maxflow.out");
long min(long a,long b)
{return (a)<(b)?(a):(b);}
void flux_maxim()
{long i,j,r;
for(;bfs();flux+=r)
{r=inf;
i=d;
while(i!=s)
{r=min(r,c[t[i]][i]-f[t[i]][i]);
i=t[i];
}
i=d;
while(i!=s)
{f[t[i]][i]+=r;
f[i][t[i]]-=r;
i=t[i];
}
}
}
void afis()
{
fout<<flux<<'\n';
fout.close();
}
int main()
{cit();
flux_maxim();
afis();
return 0;
}