Pagini recente » Cod sursa (job #1014004) | Cod sursa (job #906073) | Cod sursa (job #93958) | Monitorul de evaluare | Cod sursa (job #552118)
Cod sursa(job #552118)
#include <cstdio>
#include <cstring>
using namespace std;
FILE *fin=fopen("maxflow.in","r");
FILE *fout=fopen("maxflow.out","w");
#define NMAX 1001
struct graf {
int x;
graf *urm;
}*G[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX];
int n,m;
int Q[NMAX],K,pre[NMAX],fluxul;
bool viz[NMAX];
inline int min(int x,int y)
{
if(x<y) return x;
return y;
}
void add(graf *&g,int x)
{
graf *p=new graf;
p->x=x;
p->urm=g;
g=p;
}
bool bfs()
{
K=0;
int i,x;
Q[++K]=1;
memset(viz,false,sizeof(viz));
memset(pre,0,sizeof(pre));
viz[1]=true;
for(i=1;i<=K;i++)
{
x=Q[i];
if(x==n)
continue;
for(graf *g=G[x];g!=NULL;g=g->urm)
{
if(F[x][g->x]<C[x][g->x]&&!viz[g->x])
{
Q[++K]=g->x;
viz[g->x]=true;
pre[g->x]=x;
}
}
}
return viz[n];
}
void flux()
{
int i,cm,x;
while(bfs())
{
for(graf *g=G[n];g!=NULL;g=g->urm)
{
x=g->x;
if(!viz[x]||C[x][n]==F[x][n])
continue;
cm=2891821;
pre[n]=x;
for(i=n;pre[i]!=0;i=pre[i])
cm=min(cm,C[pre[i]][i]-F[pre[i]][i]);
if(cm==0)
continue;
for(i=n;pre[i]!=0;i=pre[i])
{
F[pre[i]][i]+=cm;
F[i][pre[i]]-=cm;
}
fluxul+=cm;
}
}
}
int main()
{
fscanf(fin,"%d %d",&n,&m);
int i,x,y,c,xm=0;
for(i=1;i<=m;i++)
{
fscanf(fin,"%d %d %d",&x,&y,&c);
add(G[x],y);
add(G[y],x);
C[x][y]=c;
}
flux();
fprintf(fout,"%d",fluxul);
return 0;
}