Cod sursa(job #240146)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 6 ianuarie 2009 22:03:37
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#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;
}