Cod sursa(job #245295)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 17 ianuarie 2009 16:31:24
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>

using namespace std;

#define N 1024
#define INF 100000000

vector<long> a[N]; 
long q[N], c[N][N], tata[N], n, nr, sol[N] /*, *a[N]*/;

inline int bfs(){
long x,p,u,i,j,ok=0;
     memset(tata,0,N * sizeof(long));
     q[0]=1;tata[1]=1;nr=0;
     for (p=0,u=0;p<=u;p++){
         x=q[p];
   /*      for (j=1;j<=a[x][0];j++)
             if (c[x][a[x][j]]>0 &&!tata[a[x][j]]){
                tata[a[x][j]]=x;q[++u]=a[x][j];
                if (tata[n]!=0){ u--,tata[n]==0; sol[++nr]=x;} 
             }
   */
          for (j=0;j<a[x].size();j++)
              if (c[x][a[x][j]]>0 &&!tata[a[x][j]]){
                 if (a[x][j]==n){ ok=1; continue; }
                tata[a[x][j]]=x,q[++u]=a[x][j];
              }
     }
     return (ok);
}

int main (){
long x,y,z,flux=0,i,m,min,w;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    
    scanf("%ld %ld ",&n,&m);
    
//    for (i=1;i<=n;i++){a[i]=(long*) malloc(sizeof(long));a[i][0]=0;}
    
    for (i=1;i<=m;i++){ scanf("%ld %ld %ld",&x,&y,&z);
        c[x][y]=z;
        a[x].push_back(y);
        a[y].push_back(x);
        
 /*       a[x][0]++;
        a[x]=(long*) realloc (a[x],(a[x][0]+1)*sizeof(long));
        a[x][a[x][0]]=y;

        a[y][0]++;
        a[y]=(long *) realloc (a[y],(a[y][0]+1)*sizeof(long));
        a[y][a[y][0]]=x;
   */
    }
    
    while (bfs()){
          min=INF;
          for (w=0;w<a[n].size();w++)
            if (tata[a[n][w]]){
              min=c[a[n][w]][n];
              
              for (i=a[n][w];i!=1;i=tata[i])
                  if (c[tata[i]][i]<min) min=c[tata[i]][i];
              
              c[a[n][w]][n]-=min;c[n][a[n][w]]+=min;
              for (i=a[n][w];i!=1;i=tata[i]) c[tata[i]][i]-=min,c[i][tata[i]]+=min;
          
              flux+=min;
          }    
    }
    printf("%ld\n",flux);
    return 0;
}