Cod sursa(job #347405)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 11 septembrie 2009 22:43:05
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 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;
}

void 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++;
     }
}
int FluxMax()
{

    do
    {
        BF();
        for(Nod *it = a[n]; it; it = it -> next)
        {
        if (!viz[it->val] || C[it -> val] - F[it -> val][n] <= 0) continue;
        min = 0;
        AuxEnd = n;
        Wh[n] = it -> val;
        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 = it -> val; Wh[AuxEnd]; AuxEnd = Wh[AuxEnd])
         {
           F[Wh[AuxEnd]][AuxEnd] += min;
           F[AuxEnd][Wh[AuxEnd]] -= min;
         }
         fT += min;
        }

    }
    while (viz[n]);

    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());
}