Cod sursa(job #263893)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 20 februarie 2009 22:07:49
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <cstdio>

int N, M, K, P, C[3505][155], a[155][155], am[3505][155], tmax;

typedef struct nod
{
	int x, c;
	nod *a;
} *pNod;
pNod v[155];

void add(int x, int y)
{
	pNod q = new nod;
	q -> x = y;
	q -> a = v[x];
	v[x] = q;
}

struct que
{
	int x, y;
};
que qq[11005];

int max(int x, int y) { return x > y ? x : y;}

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

	int i, j, x, y, c;

	scanf("%d %d %d %d", &N, &M, &K, &P);

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		a[x][y] = a[y][x] = c;
		add(x, y); add(y, x);
	}

	for (i = 1; i <= K; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		am[y][x] += c;
		if (y > tmax) tmax = y;
	}

	for (i = 1; i <= P; i++)
	{
		scanf("%d %d", &qq[i].x, &qq[i].y);
		if (qq[i].y > tmax) tmax = qq[i].y;
	}

	for (i = 0; i <= tmax; i++)
		for (j = 1; j <= N; j++) C[i][j] = -1;

	C[0][1] = 0;

	for (i = 0; i <= tmax; i++)
	{
		for (j = 1; j <= N; j++)
		{
			if (C[i][j] != -1)
			{			
				C[i][j] += am[i][j];
				C[i + 1][j] = max(C[i][j], C[i + 1][j]);			
				
				for (pNod q = v[j]; q != NULL; q = q -> a)
					if (i + a[j][q -> x] <= tmax
						) 	
						C[i + a[j][q -> x]][q -> x] = max(C[i][j], C[i + a[j][q->x]][q ->x]);				
		
			}
//			printf("%6d ",C[i][j]);
		}
//		printf("\n");
	}

	for (i = 1; i <= P; i++)		
		printf("%d\n", C[qq[i].y][qq[i].x]);
	return 0;
}


/*


#include <cstdio>

int N, M, K, P, C[3505][155], a[155][155], am[3505][155], tmax;

typedef struct nod
{
	int x, c;
	nod *a;
} *pNod;
pNod v[155];

struct que
{
	int x, y;
};
que qq[11005];

void add(int x, int y)
{
	pNod q = new nod;
	q -> x = y;
	q -> a = v[x];
	v[x] = q;
}

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

	int i, j, x, y, c;

	scanf("%d %d %d %d", &N, &M, &K, &P);

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		a[x][y] = a[y][x] = c;
		add(x, y); add(y, x);
	}

	for (i = 1; i <= K; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		am[y][x] += c;
		if (y > tmax) tmax = y;
	}

	
	for (i = 1; i <= P; i++)
	{
		scanf("%d %d", &qq[i].x, &qq[i].y);
		if (qq[i].y > tmax) tmax = qq[i].y;
	}

	for (i = 0; i <= tmax; i++) 
		for (j = 1; j <= N; j++) C[i][j] = -1;


	C[0][1] = 0;

	for (i = 0; i <= tmax; i++)
	{
		for (j = 1; j <= N; j++)
		{
			if (C[i][j] != -1)
			{			
				C[i][j] += am[i][j];
				if (C[i][j] > C[i + 1][j]) C[i + 1][j] = C[i][j];
				
				for (pNod q = v[j]; q != NULL; q = q -> a)
					if (i + a[j][q -> x] <= tmax && C[i][j] > C[i + a[i][q ->x]][q->x]) C[i + a[j][q -> x]][q -> x] = C[i][j];	
			}
//			printf("%6d ",C[i][j]);
		}
//		printf("\n");
	}

	for (i = 1; i <= P; i++)		
		printf("%d\n", C[qq[i].y][qq[i].x]);
	
	return 0;
}



*/