Pagini recente » Cod sursa (job #2644886) | Cod sursa (job #250754)
Cod sursa(job #250754)
#include <stdio.h>
#include <bitset>
#define INF 2147000000
using namespace std;
struct muchie{int x,y;}a[5005];
int n,m,i,j,x,y,z,flux,aux,minim,nod;
int g[1024],t[1024],path[1024],cap[1005][1024];
int * v[1005];
bitset<1024>mark;
bool BFS(){
int i,nod,fiu,p=1,q=1,que[1024];
mark.reset();
que[1]=1;mark[1]=1;
while (p<=q){
nod=que[p];
for (i=0;i<g[nod];++i){
fiu=v[nod][i];
if (!mark[fiu])
if (cap[nod][fiu]){
que[++q]=fiu;t[fiu]=nod;mark[fiu]=1;
}
}
p++;
}
return mark[n];
}
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,&z);
g[x]++; g[y]++; cap[x][y]=z;
a[i].x=x; a[i].y=y;
}
for (i=1;i<=n;++i)v[i]=(int*)malloc(g[i]*sizeof(int)),g[i]=0;
for (i=1;i<=m;++i){ x=a[i].x; y=a[i].y; v[x][g[x]++]=y; v[y][g[y]++]=x;}
//////////////
flux=0;
do{
if ( !BFS() )break;
for (i=0; i<g[n]; ++i){
nod=v[n][i];
if (!cap[nod][n] || !mark[nod] )continue;
m=0; aux=n; minim=INF;
while (aux){path[++m]=aux;aux=t[aux];}
for (j=1;j<m;++j)
if (minim > cap[path[j+1]][path[j]] ) minim=cap[path[j+1]][path[j]];
for (j=1;j<m;++j){
cap[path[j+1]][path[j]]-=minim;
cap[path[j]][path[j+1]]+=minim;
}
flux+=minim;
}
}while (1);
printf("%ld\n",flux);
return 0;
}