Pagini recente » Cod sursa (job #2631251) | Cod sursa (job #2123193) | Cod sursa (job #2141741) | Cod sursa (job #890357) | Cod sursa (job #252736)
Cod sursa(job #252736)
#include<stdio.h>
#include<string.h>
#define nmax 1024
#define oo 0x3f3f3f3f
FILE *f=fopen("maxflow.in","r"), *g=fopen("maxflow.out","w");
int n,m,C[nmax][nmax],viz[nmax],flow,fmin,x,y,z,tata[nmax],F[nmax][nmax],i;
int Q[nmax];
int G[nmax][nmax*2];
inline int min(int x, int y)
{
if(x<y) return x;
return y;
}
void citire()
{
fscanf(f,"%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
fscanf(f,"%d %d %d",&x,&y,&z);
G[x][++G[x][0]]=y;
G[y][++G[y][0]]=x;
C[x][y]+=z;
}
fclose(f);
}
inline int bfs()
{
int prim, ultim,x,i;
memset(viz,0,sizeof(viz));
prim=ultim=0;
Q[0]=1;
viz[1]=1;
while(prim<=ultim)
{
x=Q[prim++];
if(x==n) continue;
for(i=1;i<=G[x][0];i++)
{
if (C[x][G[x][i]] == F[x][G[x][i]] || viz[G[x][i]]) continue;
Q[++ultim]=G[x][i];
tata[G[x][i]]=x;
viz[G[x][i]]=1;
}
}
return viz[n];
}
int main()
{
citire();
flow=0;
while(bfs())
for(i=1;i<=G[n][0];i++)
{
if (F[G[n][i]][n] == C[G[n][i]][n] || !viz[G[n][i]]) continue;
tata[n]=G[n][i];
fmin=oo;
for(i=n;i!=1;i=tata[i])
{
fmin=min(fmin, C[tata[i]][i]-F[tata[i]][i]);
}
if (fmin == 0) continue;
for(i=n;i!=1;i=tata[i])
{
F[tata[i]][i]+=fmin;
F[i][tata[i]]-=fmin;
}
flow+=fmin;
}
fprintf(g,"%d\n",flow);
fclose(g);
return 0;
}