Cod sursa(job #347263)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 11 septembrie 2009 17:28:45
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<stdio.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 y;
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;
}
void InitViz()
{
    for(int i = 1; i <= n; i++)
     viz[i] = 0;
    viz[1] = 1;
    Wh[n] = 0;
}
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])
          {
              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++;
     }

     int AuxEnd = n;
     int min = 0;
     if (Wh[AuxEnd])
      min = C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd];
     while (Wh[AuxEnd])
     {
          A2 = AuxEnd;
          A1 = Wh[A2];
         if (min > C[A1][A2] - F[A1][A2]) min = C[A1][A2] - F[A1][A2];
         AuxEnd = Wh[AuxEnd];
     }

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