Cod sursa(job #59179)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 8 mai 2007 14:31:20
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<stdio.h>
#include<deque>

#define NMAX 128

using namespace std;

void read();
void solve();

int N, A[NMAX], V[NMAX][NMAX], nrv[NMAX], C[NMAX][NMAX], *v[NMAX * NMAX], nr[NMAX * NMAX], *seen[NMAX * NMAX], prev[NMAX * NMAX], ok[NMAX * NMAX], s[NMAX * NMAX];
deque<int> cd, num;

int main()
{
	freopen("algola.in", "r", stdin);
     freopen("algola.out", "w", stdout);

     read();
     solve();
	return 0;
}

void read()
{
	int M, i, j, z;
     
	scanf("%d%d", &N, &M);
     for(i = 0; i < N; i++)
     scanf("%d", A + i);

     for(; M--;)
     {
     	scanf("%d%d%d", &i, &j, &z);
          i--, j--;
          V[i][nrv[i]] = j, C[i][nrv[i]++] = z;
          V[j][nrv[j]] = i, C[j][nrv[j]++] = z;
     }
}

void solve()
{
	int i, j, z, t, x, y;

     for(i = 0; i <= 100; i++)
     for(j = 0; j < N; j++)
     {
     	nr[i * N + j] = 1;
	     for(z = 0; z < nrv[j]; z++)
	     for(t = 0; t < C[j][z]; t++)
	     nr[i * N + j]++;
     }

     for(i = 0; i <= 100; i++)
     for(j = 0; j < N; j++)
     {
	    	v[i * N + j] = new int[nr[i * N + j] + 1],
     	seen[i * N + j] = new int[nr[i * N + j] + 1];
          memset(seen[i * N + j], 0, (nr[i * N + j] + 1) * sizeof(int));
          nr[i * N + j] = 0;
     }

     for(i = 0; i <= 100; i++)
     for(j = 0; j < N; j++)
     {
     	v[i * N + j][nr[i * N + j]++] = (i + 1) * N + j;
          
	     for(z = 0; z < nrv[j]; z++)
	     for(t = 0; t < C[j][z]; t++)
	     v[i * N + j][nr[i * N + j]++] = (i + 1) * N + V[j][z];
     }

     int max = 0;
     
     for(i = 0; i < N; i++)
	for(j = 0; j < A[i]; j++)
     {
	     cd.clear(), num.clear();

          memset(s, 0, sizeof(s));
	     cd.push_back(i), num.push_back(0);
          s[i] = 1;
          
	     for(; !cd.empty();)
	     {
	     	x = cd[0], y = num[0];
               if(j == 3 && y == 51 && x % N == 1)
               x = cd[0];
               if(x % N == 0)
               break;
	          for(z = 0; z < nr[x]; z++)
	          if(!seen[x][z] && !s[v[x][z]])
	          {
	          	cd.push_back(v[x][z]);
                    s[v[x][z]] = 1;
	               num.push_back(y + 1);
                    prev[v[x][z]] = x, ok[v[x][z]] = z;
	          }
               cd.pop_front();
               num.pop_front();
	     }
          
		for(; x != i; x = prev[x])
          if((x % N) != (prev[x] % N))
		seen[prev[x]][ok[x]] = 1;
          
          if(y > max)
          max = y;
     }
     printf("%d\n", max);
}