Cod sursa(job #1539618)

Utilizator lilian_ciobanuLilian Ciobanu lilian_ciobanu Data 1 decembrie 2015 02:34:14
Problema Flux maxim Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NMAX 1005
#define INF 1000000000
#define min(a,b) ((a)<(b)?(a):(b))

typedef struct node{
   int x;
   struct node* next;
} NOD;

NOD* g[NMAX];
int viz[NMAX], C[NMAX][NMAX], F[NMAX][NMAX], P[NMAX], N, M, cd[NMAX];

void add_node(NOD **a, int val){
   NOD* w = (NOD*)malloc(sizeof(NOD));

   w->x = val;
   w->next = *a;

   *a = w;
}

int BFS(){
   int i, j, nod, V;

   NOD *w = (NOD*)malloc(sizeof(NOD));

   memset(viz, 0, sizeof(viz));
   cd[0] = 1;
   cd[1] = 1;

   viz[1] = 1;

   for(i = 1; i <= cd[0]; ++i){
      nod = cd[i];

      if(nod == N) continue;

      w = g[nod];
      while(w != NULL){
         V = w->x;
         w = w->next;

         if(C[nod][V] == F[nod][V] || viz[V]) continue;

         viz[V] = 1;
         cd[++cd[0]] = V;
         P[V] = nod;
      }
   }

   return viz[N];
}


int main(){
   freopen("maxflow.in", "r", stdin);
   freopen("maxflow.out", "w", stdout);

   scanf("%d %d", &N, &M);

   int i, x, y, z, flow, fmin, nod;
   for(i = 0; i < M; ++i){
      scanf("%d %d %d", &x, &y, &z);
      C[x][y] += z;
      add_node(&g[x], y);
      add_node(&g[y], x);
   }

   NOD *w;
   for(flow = 0; BFS();){
      w = g[N];
      while(w != NULL){
         nod = w->x;
         w = w->next;

         if(F[nod][N] == C[nod][N] || !viz[nod]) continue;

         P[N] = nod;

         fmin = INF;
         for(nod = N; nod != 1; nod = P[nod]){
            fmin = min(fmin, C[P[nod]][nod] - F[P[nod]][nod]);
         }

         //if(fmin == 0) continue;

         for(nod = N; nod != 1; nod = P[nod]){
            F[P[nod]][nod] += fmin;
            F[nod][P[nod]] -= fmin;
         }

         flow += fmin;
      }

   }

   printf("%d", flow);

return 0;
}