Pagini recente » Cod sursa (job #1744382) | Cod sursa (job #574035) | Cod sursa (job #2288158) | Cod sursa (job #1908142) | Cod sursa (job #1051616)
#include<cstdio>
#include<queue>
using namespace std;
const int INF=0x7fffffff;
const int MAXN=1001;
queue <int> q;
int fluxTotal,n,m,i,j,x,y,tata,c,capacitate[MAXN][MAXN],flux[MAXN][MAXN],fluxDrum,rest[MAXN][MAXN],vmin[MAXN],reconst[MAXN];
bool inqueue[MAXN];
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&c);
capacitate[x][y]=c;
rest[x][y]=c;
}
do
{
q.push(1);
inqueue[1]=true;
vmin[1]=INF;
for(i=2; i<=n; i++)
{
vmin[i]=0;
}
while(!q.empty())
{
tata=q.front();
for(i=1; i<=n; i++)
{
if (vmin[i]<min(rest[tata][i], vmin[tata]))
{
vmin[i]=min(rest[tata][i], vmin[tata]);
reconst[i]=tata;
if(!inqueue[i])
{
q.push(i);
inqueue[i]=true;
}
}
}
q.pop();
inqueue[tata]=false;
/*
printf("%d::",tata);
for(i=1;i<=n;i++)
printf("%d ",vmin[i]);
printf("\n");//*/
}
fluxDrum=vmin[n];
if(fluxDrum)
for(i=n; i!=1; i=reconst[i])
{
flux[reconst[i]][i]+=fluxDrum;
flux[i][reconst[i]]-=fluxDrum;
rest[reconst[i]][i]=capacitate[reconst[i]][i]-flux[reconst[i]][i];
rest[i][reconst[i]]=capacitate[i][reconst[i]]-flux[i][reconst[i]];
}
}
while (fluxDrum!=0);
/*
printf("%d::",fluxDrum);
for(i=1;i<=n;i++)
{
printf("%d ",vmin[i]);
}
printf("\n");
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",rest[i][j]);
printf("\n");
}//*/
for(i=1;i<=n;i++)
{
fluxTotal+=flux[i][n];
}
printf("%d\n",fluxTotal);
return 0;
}