Cod sursa(job #9640)

Utilizator 004444Lapusan Tudor 004444 Data 27 ianuarie 2007 16:30:39
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 3.13 kb
#include <stdio.h>
#define MAX 152


typedef struct nod
{
    int x, cost;
    nod *adr_urm;
}*pnod;

pnod l[MAX], ll[MAX];

int n, m, k, q, xx, yy, max_timp;
int qq[1001], qt[1001] , px[82], py[82];
long int c[20][70];


void citire ();
void add ( int i, int j, int cost );
void add1 ( int i, int j, int cost );
void solve ();
void init ();
void dinamica ();
void afisare ();

inline int max ( int i, int j, int jj )
{
    int m = -1;
    
	if ( j > jj )
        return 0;

    for ( j = j; j <= jj; j++ )
        if ( c[i][j] > m )
            m = c[i][j];
    return m;
}


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

    citire ();
	solve ();
	afisare ();

    return 0;
}

void citire ()
{
    int i, x, y, cost;

    scanf ( "%d %d %d %d", &n, &m, &k, &q );
	for ( i = 1; i <= m; i++ )
	{
		scanf ( "%d %d %d", &x, &y, &cost );
//        printf ( "%d %d %d\n", x, y, cost );
        add ( x, y, cost );
        add ( y, x, cost );
    }
    for ( i = 1; i <= k; i++ )
    {
        scanf ( "%d %d %d", &x, &y, &cost );
        //printf ( "%d %d %d\n", x, y, cost );
        add1 ( x, y, cost );
    }

    for ( i = 1; i <= q; i++ )
    {
		scanf ( "%d %d", &xx, &yy );
		px[i] = xx;
		py[i] = yy;
		if ( yy > max_timp )
            max_timp = yy;
    }

//        printf ( "%d %d\n", x, y );
//    pnod p;
//    for ( p = ll[2]; p; p = p->adr_urm )
//        printf ( "%d %d\n", p->x, p->cost );
}
    
void add ( int i, int j, int cost )
{
    pnod p = new nod;

	p->x = j;
	p->cost = cost;
	p->adr_urm = l[i];
    l[i] = p;
}

void add1 ( int i, int j, int cost )
{
    pnod p = new nod;

    p->x = j;
    p->cost = cost;
    p->adr_urm = ll[i];
    ll[i] = p;
}

void solve ()
{
	init ();
    dinamica ();
}

void init ()
{
    int i, j;

    for ( i = 1; i <= n; i++ )
        for ( j = 0; j <= max_timp + 1; j++ )
			c[i][j] = 0;
}

void dinamica ()
{
	pnod p, p1;
	int i, j, ind, z, aux, cost, jj, prim, ultim, timp, maxim;

	prim = ultim = 1;
	qq[1] = 1;
	qt[1] = 0;

	for ( prim = 1; prim <= ultim; prim++ )
	{
		i = qq[prim];
		timp = qt[prim];

		for ( p = l[i]; p; p = p->adr_urm )
		{
			j = p->x;
			cost = p->cost;
			aux = timp + p->cost;
			//ultim++;
			//qq[ultim] = j;

			ind = 0;
			for ( p1 = ll[j]; p1; p1 = p1->adr_urm )
			{
				jj = p1->x - cost;
				if ( timp + cost > p1->x )
					continue;
				ind = 1;
				maxim = max ( i, 0, jj );

				if ( c[j][p1->x] < maxim + p1->cost )
				{
					c[j][p1->x] = maxim + p1->cost;
					//if ( aux <= max_timp )
					//{
						ultim++;
						qq[ultim] = j;
						qt[ultim] = p1->x;
					//}
					//if ( p1->x > aux )
					//	aux = p1->x;
				}
			}
			if ( !ind )
			{
				for ( z = 0; z <= max_timp; z++ )
					if ( c[j][z + cost] < c[i][z] )
						c[j][z + cost] = c[i][z];

				ultim++;
				qq[ultim] = j;
				qt[ultim] = aux;
			}

			if ( prim >= 100 )
				break;
		}
    }
}

void afisare ()
{
	int i;

	for ( i = 1; i <= q; i++ )
		printf ( "%d\n", max ( px[i], 0, py[i] ) );
}