Cod sursa(job #347251)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 11 septembrie 2009 16:58:55
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include<stdio.h>
#define MAX 555000000
struct Nod {
        int val;
        Nod *next;
};
int C[1030][1030];
int flux;
int c;
int F[1030][1030];
int n;
int fT;
int x;
int viz[1030];
int y;
int Q[1030];
int Wh[1030];
int m;
Nod *a[1030];

void insert(Nod *&u, int P)
{
    Nod *k = new Nod;
    k -> val = P;
    k -> next = u;
    u = k;
}
void InitViz()
{
    for(int i = 1; i <= n; i++)
     viz[i] = 0;
    viz[1] = 1;
}
int BF()
{
    int cap = 1;
    int end = 1;
    Q[cap] = 1;
    InitViz();

    while (cap <= end)
     {
         for(Nod *it = a[Q[cap]]; it; it = it -> next)
          if (!viz[it->val])
           if (C[Q[cap]][it -> val] - F[Q[cap]][it -> val] > 0)

           {
               Q[++end] = it -> val;
               viz[it->val] = 1;
               Wh[end] = cap;
               if (it -> val == n)
                {
                    cap = end;
                    break;
                }
           }
          cap++;
     }
     int min = MAX;
     if (Q[end] == n)
     {
      int AuxEnd = end;
      while (Wh[AuxEnd] != 0)
       {
           int Cmin = C[Q[Wh[AuxEnd]]][Q[AuxEnd]] - F[Q[Wh[AuxEnd]]][Q[AuxEnd]];
           if (min > Cmin)
             min = Cmin;
           AuxEnd = Wh[AuxEnd];
       }
       AuxEnd = end;
      while (Wh[AuxEnd] != 0)
       {
           F[Q[Wh[AuxEnd]]][Q[AuxEnd]] += min;
           F[Q[AuxEnd]][Q[Wh[AuxEnd]]] -= min;
           AuxEnd = Wh[AuxEnd];
       }
     }
    if (min == MAX) min = 0;
    return min;


}
int FluxMax()
{

    do
    {
        flux = BF();
        fT += flux;
    }
    while (flux);

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

        scanf("%d %d",&n,&m);
        for(int i = 1; i <= m; i++)
         {
             scanf("%d %d %d",&x, &y, &c);
             insert(a[x],y);
             insert(a[y],x);
             C[x][y] = c;
         }
         printf("%d\n",FluxMax());
}