Cod sursa(job #347381)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 11 septembrie 2009 22:18:17
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include<stdio.h>
#include<string.h>

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 min;
int y;
int AuxEnd;
int Q[1030];
int A2;
int A1;
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;
}

int BF()
{
    int cap = 1;
    int end = 1;
    Q[cap] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    Wh[n] = 0;

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

           if (C[A1][A2] - F[A1][A2] > 0)

           {
               Q[++end] = it -> val;
               viz[it->val] = 1;
               Wh[Q[end]] = Q[cap];
               if (it -> val == n)
                {
                    cap = end;
                    break;
                }
           }
           }
          cap++;
     }

     AuxEnd = n;
     min = 0;
     for(min = C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd];Wh[AuxEnd]; AuxEnd = Wh[AuxEnd])
      if (min > C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd])
       min = C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd];

     for(AuxEnd = n; Wh[AuxEnd]; AuxEnd = Wh[AuxEnd])
       {
           F[Wh[AuxEnd]][AuxEnd] += min;
           F[AuxEnd][Wh[AuxEnd]] -= min;
       }
    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());
}