Pagini recente » Cod sursa (job #3290991) | Cod sursa (job #240148)
Cod sursa(job #240148)
#include <stdio.h>
#include <bitset>
#define INF 200000
using namespace std;
long n,m,i,c,ok,q,flux,minim;
long x[5002],y[5002],g[1024],d[1024],cap[1001][1024];
int *v[1024];
bitset <1024>mark;
void dfs(int x){
mark[x]=1;
for (int i=0;i<g[x]&&ok;++i)
if (cap[x][v[x][i]]){
if (v[x][i]==n){ok=0;break;}
if (!mark[v[x][i]])
dfs(v[x][i]);
}
if (!ok)d[++q]=x;
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%ld %ld",&n,&m);
for (i=1;i<=m;++i) {scanf("%ld %ld %ld",&x[i],&y[i],&c),g[x[i]]++;g[y[i]]++;cap[x[i]][y[i]]=c;}
for (i=1;i<=n;++i) {v[i]=(int*)malloc(g[i]*sizeof(int));g[i]=0;}
for (i=1;i<=m;++i) v[x[i]][g[x[i]]++]=y[i],v[y[i]][g[y[i]]++]=x[i];
//
flux=0;
do{
mark.reset();d[1]=n;q=1;ok=1;
dfs(1);if(ok)break;
minim=INF;
for (i=1;i<q;++i)
if (cap[d[i+1]][d[i]]<minim)minim=cap[d[i+1]][d[i]];
for (i=1;i<q;++i) {cap[d[i+1]][d[i]]-=minim;cap[d[i]][d[i+1]]+=minim;}
flux+=minim;
}while (1);
printf("%ld\n",flux);
return 0;
}