Pagini recente » Cod sursa (job #2189292) | Cod sursa (job #516669) | Cod sursa (job #946156) | Cod sursa (job #86404) | Cod sursa (job #1164899)
#include <cstdio>
#include <queue>
#include <cstring>
const int Q=1001,INF=2000000000;
FILE* in;
FILE* out;
int nrnod,nrmuc;
int mat[Q][Q],f[Q][Q];
bool finish[Q];
int actnod=1;
int pred[Q],nxt[Q],nrelem=1;
bool viz[Q];
int min(int a,int b)
{
return a<b?a:b;
}
std::queue<int> cod;
bool bfs()
{
while(!cod.empty())
{
cod.pop();
}
memset(viz,0,sizeof viz);
cod.push(1);
int act;
while(cod.front()!=nrnod && !cod.empty())
{
act=cod.front();
for(int i=1; i<=nrnod; i++)
{
if(viz[i]==0 && mat[act][i]-f[act][i]>0)
{
viz[i]=1;
cod.push(i);
pred[i]=act;
}
}
cod.pop();
}
if(cod.front()==nrnod)
return 1;
return 0;
}
void drum(int val)
{
int x=nrnod;
while(x!=1)
{
f[pred[x]][x]+=val;
f[x][pred[x]]-=val;
x=pred[x];
}
}
int minim()
{
int m=INF,x=nrnod;;
while(x!=1)
{
m=min( m,(mat[pred[x]][x]-f[pred[x]][x])>0 ? (mat[pred[x]][x]-f[pred[x]][x]) : -(mat[pred[x]][x]-f[pred[x]][x]) );
x=pred[x];
}
return m;
}
int main()
{
in=fopen("maxflow.in","r");
out=fopen("maxflow.out","w");
fscanf(in,"%d%d",&nrnod,&nrmuc);
int a,b,c;
for(int i=1; i<=nrmuc; i++)
{
fscanf(in,"%d%d%d",&a,&b,&c);
mat[a][b]=c;
//mat[b][a]=-c;
}
viz[1]=1;
int m;
while(bfs())
{
m=minim();
drum(m);
actnod=1;
}
int rez=0;
for(int i=1; i<nrnod; i++)
{
if(f[i][nrnod]!=0)
rez+=f[i][nrnod];
}
fprintf(out,"%d",rez);
fclose(in);
fclose(out);
return 0;
}