Cod sursa(job #270672)
Utilizator | Data | 4 martie 2009 13:03:05 | |
---|---|---|---|
Problema | Flux maxim | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.08 kb |
#include<fstream.h>
#define N 1001
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,c[N][N],flux,d[N],k,viz[N],q[N],t[N];
void read()
{ int i,x,y,ct;
fin>>n>>m;
for(i=1;i<=m;i++)
{ fin>>x>>y>>ct;
c[x][y]+=ct;
}
}
void bfs()
{ int p,u,i,j;
for(i=1;i<=n;i++) t[i]=d[i]=q[i]=viz[i]=0;
p=u=1;
q[1]=viz[1]=1;
k=0;
while(p<=u)
{ for(i=1;i<=n;i++)
if(!viz[i]&&c[q[p]][i])
{ q[++u]=i;
viz[i]=1;
t[i]=q[p];
if(i==n)
{ k=1;
d[1]=n;
int x;
x=n;
while(t[x]!=0)
{ k++;
d[k]=t[x];
x=t[x];
}
for(j=1;j<=k/2;j++)
{ int aux;
aux=d[j];
d[j]=d[k-j+1];
d[k-j+1]=aux;
}
return;
}
}
p++;
}
return;
}
void fordFulkerson()
{ int i,min;
do
{ bfs();
if(k>0)
{ min=c[d[1]][d[2]];
for(i=2;i<k;i++)
if(c[d[i]][d[i+1]]<min)
min=c[d[i]][d[i+1]];
flux+=min;
for(i=1;i<k;i++)
{ c[d[i]][d[i+1]]-=min;
c[d[i+1]][d[i]]+=min;
}
}
}
while(k);
}
int main()
{ read();
fordFulkerson();
fout<<flux<<'\n';
return 0;
}