Cod sursa(job #347123)

Utilizator mika17Mihai Alex Ionescu mika17 Data 11 septembrie 2009 09:14:27
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.23 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define min(a,b) ((a) < (b) ? (a) : (b))

#define FIN "maxflow.in"
#define FOUT "maxflow.out"
#define MAXN 1000
#define MAXE 5000
#define oo 0x7FFFFFFF

typedef struct edge
{
        int v,c;
        edge(int _v,int _c) : v(_v), c(_c) {}
} * graph[MAXN];

void readGraph(graph &G,int &N,FILE * fin) {

     int n,m,deg[MAXN];
     struct {int x,y,c;} edg[MAXE];
     
     fscanf(fin,"%d%d",&n,&m);
     
     memset(deg,0,sizeof deg);
     
     for(int i = 0 ; i < m ; ++i) {

             fscanf(fin,"%d%d%d",&edg[i].x,&edg[i].y,&edg[i].c);
             -- edg[i].x; -- edg[i].y;
             deg[ edg[i].x ] ++;
             deg[ edg[i].y ] ++;
     }
     //probabil e busit callocu pe structuri(clase)
     //G = (edge**)calloc(N,sizeof(edge*)); 
     N = n;
     for(int i = 0 ; i < n ; deg[i++] = 0) {
             
                     G[i] = (edge*)calloc(deg[i] + 1,sizeof(edge));
                     G[i][ deg[i] ] = edge(-1,-1);
     }
     for(int i = 0; i < m; ++i)            {
           G[ edg[i].x ] [ deg[ edg[i] . x ] ++ ] = edge(edg[i] . y, edg[i] . c);
           G[ edg[i].y ] [ deg[ edg[i] . y ] ++ ] = edge(edg[i] . x, 0);
     }        
     fclose(fin);
}

void writeSol(int sol,FILE * fout) {
     
    fprintf(fout,"%d",sol);
    fclose(fout);
}


void initFlow(graph G,int ** &R,int N) {

     R = (int**)calloc(N,sizeof(int*));
     
     for(int i = 0 ; i < N; ++i) {
             
             R[i] = (int*)calloc(N,sizeof(int));
             memset(R[i],0,N*sizeof(int));
     }
     
     for(int i = 0; i < N; ++i)
      for(edge *p = G[i]; p -> v != -1 ; ++p)
       R[i][p -> v] += p -> c;
}

bool BFS(graph G,int **R,int N,int * t,int src,int dest) {
    
    int q[MAXN],l = 0, r = -1;
    bool vis[MAXN], f = false;
    memset(vis,false,sizeof vis);
    
    t[src] = -1;
    q[++r] = src;
    vis[src] = true;
    
    for(;l <= r;++l) 
       for(edge *p = G[ q[l] ] ; p->v != -1; ++p)
             if(!vis [ p -> v ] && R[ q[l] ][ p->v ]) {
                     
                     vis[ p -> v] = true;
                     t[ p -> v ] = q[l];
                     q[++r] = p -> v;
                     if(p->v == dest) f = true;
             }
    return f;
}


void writeFlow(int ** R,int N,FILE * flog) {
     
     for(int i=0;i<N;++i) {
      for(int j =0;j< N; ++j)
       fprintf(flog,"%d ",R[i][j] < oo ? R[i][j] : -1);
      fprintf(flog,"\n");
     }
     fprintf(flog,"\n\n\n");
}


int maxFlow(graph G,int N) {
    
   int **R,t[MAXN],flow = 0,src = 0,sink = N - 1;
   
   initFlow(G,R,N);
   
   //FILE * log = fopen("log.txt","w");
   //writeFlow(R,N,log);
   
   for(int minc; BFS(G,R,N,t,src,sink) ;) {
        minc = oo;    
        for(int y = sink; t[y] != -1 ; y = t[y]) 
         minc = min(minc,R[t[y]][y]);
        
        for(int y = sink; t[y] != -1 ; y = t[y]) {
         R[t[y]][y] -= minc;
         R[y][t[y]] += minc;
        }
        flow += minc; //writeFlow(R,N,log);
   }
   return flow;
}

int main() {
    
    graph G;
    int N;
    readGraph(G,N,fopen(FIN,"r"));
    writeSol(maxFlow(G,N),fopen(FOUT,"w"));
    return 0;
}