Cod sursa(job #12183)

Utilizator svalentinValentin Stanciu svalentin Data 3 februarie 2007 09:18:11
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<stdio.h>
#include<string.h>

#define MAXNI 51
#define MAXND 5051
#define MAXT 101
#define MAXMI 302

#define oo 120

#define MIN(x, y) ((x)<(y)?(x):(y))

//#define _DEBUG_

int n, m;
int pop[MAXNI], ps;
int muci[MAXMI][3];

int ladi[MAXNI][MAXNI], ladci[MAXNI][MAXNI];
int gri[MAXNI];

int lad[MAXND][MAXNI*2];
int gr[MAXND];

int ln;
int dest;
int tflux;

short int capl[MAXND][MAXND];

inline void addmuc(int a, int b, int c)
{
   lad[a][gr[a]++] = b;
   lad[b][gr[b]++] = a;
   capl[a][b] = c;
   capl[b][a] = 0;
}

int viz[MAXND];
int cl=0, cr=0;
int coada[MAXND];
int par[MAXND];

inline bool drum()
{
   memset(viz, 0, sizeof(viz));
   viz[0] = true; cl = 0; cr = 1; coada[0] = 0;

   int cur, x;
   while (cl<cr)
   {
      cur = coada[cl];
      for (int i=gr[cur]-1; i>=0; --i)
      {
         x = lad[cur][i];
//         if (!viz[x] && f[cur][x] < cap[cur][x])
         if (!viz[x] && capl[cur][x] > 0)
         {
            viz[x] = true;
            coada[cr++] = x;
            par[x] = cur;
            if (x==dest) { cl=cr; break; }
         }
      }
      ++cl;
   }
   if (viz[dest]) return true;
   else return false;
}

int main(void)
{
   freopen("algola.in", "rt", stdin);
   freopen("algola.out", "wt", stdout);

   int i;

   scanf("%d%d", &n, &m);
   for (i=1; i<=n; ++i)
      scanf("%d", &pop[i]);

   for (int i=0, x, y, z; i<m; ++i)
   {
      scanf("%d%d%d", &x, &y, &z);
      muci[i][0] = x; muci[i][1] = y; muci[i][2] = z;
      ladci[x][gri[x]] = ladci[y][gri[y]] = z;
      ladi[x][gri[x]++] = y;
      ladi[y][gri[y]++] = x;
   }

   // 0 este sursa
   // 5000 este destinatia
   dest = 5000;

   // graf timpul 0
   for (i=1; i<=n; ++i)
      addmuc(0, i, pop[i]), ps += pop[i];
   addmuc(1, dest, oo);

   ln = n+1;
   int timp, minf;
   for (tflux = 0, timp = 0; tflux<ps; ++timp)
   {
      // adauga muchii pt timp
      addmuc(ln, dest, oo);
      for (i=1; i<=n; ++i, ++ln)
      {
         for (int j=0; j<gri[i]; ++j)
            addmuc(ln-n-i+ladi[i][j], ln, ladci[i][j]);
         addmuc(ln-n, ln, oo);
      }

      while (drum())
      {
         minf = oo;
         for (i=dest; i!=0; i=par[i])
            minf = MIN(minf, capl[par[i]][i]);
         for (i=dest; i!=0; i=par[i])
         {
            capl[par[i]][i] -= minf;
            capl[i][par[i]] += minf;
         }
         tflux += minf;
#ifdef _DEBUG_
         for (i=dest; i!=0; i=par[i])
            printf("%d ", i);
         printf("0 -> baga %d\n", minf);
#endif
      }
   }

   printf("%d\n", timp);
      
   return 0;
}