Pagini recente » Cod sursa (job #241240) | Cod sursa (job #241284)
Cod sursa(job #241284)
#include<stdio.h>
#define N 1002
#define min(x,y) ((x)<(y)? (x) : (y))
#define abs(x) ((x)>0 ? (x) : (-x))
long n, m, s, d, ok, fol[N], viz[N], q[N],
c[N][N],
f[N][N];
void citire();
void rezolva();
void afisare();
int bfs();
int main(){
citire();
rezolva();
afisare();
return 0;
}
void citire(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
long i,j,x,y,vv;
scanf("%ld %ld",&n,&m);
for (i=1;i<=m;i++){
scanf("%ld%ld%ld",&x,&y,&vv);
c[x][y]=vv;
}
for (i=1;i<=n;i++){
ok=0;
for (j=1;j<=n;j++)
if (c[i][j]!=0)
ok=1,fol[j]=1;
if (!ok) d=i;
}
for (i=1;i<=n;i++)
if (!fol[i]){
s=i;break;}
}
void rezolva(){
long i, a, b, lg, v, L[N];
do{
for (i=1;i<=n;i++) viz[i]=0;
if (bfs()) return;
L[0]=d;lg=0;
a=b=2000000;
while (L[lg]!=s)
{
++lg;
L[lg]=abs(viz[L[lg-1]]);
if (viz[L[lg-1]]>0)
a=min(a,c[L[lg]][L[lg-1]]-f[L[lg]][L[lg-1]]);
else
if (viz[L[lg-1]]<0)
b=min(b,f[L[lg-1]][L[lg]]);
}
v=min(a,b);
for (i=lg;i>0;i--){
if (viz[L[i-1]]>0)
f[L[i]][L[i-1]]+=v;
else
f[L[i-1]][L[i]]-=v;
// printf("%d ",L[i]);
}
//printf("%d\n",L[0]);
}while (1);
}
int bfs(){
int p,u,i,x;
q[0]=s;viz[s]=1;
for (p=0,u=0;p<=u;p++){
x=q[p];
for (i=1;i<=n;i++)
if (!viz[i])
if (f[x][i]<c[x][i]){
viz[i]=x;
q[++u]=i;
}
else
if (f[i][x]>0){
viz[i]=-x;q[++u]=i;
}
}
return !viz[d];
}
void afisare(){
int i,vf=0;
for (i=1;i<=n;i++) vf+=f[s][i];
printf("%d\n",vf);
}