Pagini recente » Cod sursa (job #818773) | Cod sursa (job #2460572) | Cod sursa (job #1390103) | Cod sursa (job #1564273) | Cod sursa (job #59179)
Cod sursa(job #59179)
#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);
}