Cod sursa(job #29031)

Utilizator varuvasiTofan Vasile varuvasi Data 8 martie 2007 15:35:26
Problema Amenzi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#define MaxT 3501
#define MaxN 151

int N, M, K, P;
int A[MaxN][MaxT], p[MaxN][MaxT], nrA[MaxN][MaxT];
int C[MaxN][MaxT];
int e[12001][3], nrM;

int main()
{
    int a, b, c, i, j, k;
    
    FILE *fin = fopen("amenzi.in", "rt");
    FILE *fout = fopen("amenzi.out", "wt");
    fscanf(fin, "%d %d %d %d", &N, &M, &K, &P);
    for (i = 1; i <= M; i++)
    {
        fscanf(fin, "%d %d %d", &a, &b, &c);
        C[a][b] = C[b][a] = c;
        e[i][0] = a, e[i][1] = b; e[i][2] = c;
    }
    for (i = 1; i <= K; i++)
    {
        fscanf(fin, "%d %d %d", &a, &b, &c);    
        nrA[a][b] += c;
    }
    

    int t;
    for (t = 0; t < MaxT; t++)
	for (i = 1; i <= N; i++)
	    A[i][t] = -1;
    A[1][0] = 0;

    for (t = 1;t < MaxT; t++)
	for (k = 1; k <= M; k++)
	{
	    i = e[k][0], j = e[k][1], c = e[k][2];
		if (i != j)
		{
		    int ok = 1;
		    if (t - c < 0) ok = 0;
		    if (A[j][t-c] == -1) ok = 0;
		    if (ok)
		    {
			if (A[i][t] < A[j][t-c] + nrA[i][t])
			   A[i][t] = A[j][t-c] + nrA[i][t];
			if (A[i][t] < A[i][t-1] + nrA[i][t])
			   A[i][t] = A[i][t-1] + nrA[i][t];
		    }
		}
	    j = e[k][0], i = e[k][1]; c = e[k][2];
		if (i != j)
		{
		    int ok = 1;
		    if (t - c < 0) ok = 0;
		    if (A[j][t-c] == -1) ok = 0;
		    if (ok)
		    {
			if (A[i][t] < A[j][t-c] + nrA[i][t])
			   A[i][t] = A[j][t-c] + nrA[i][t];
			if (A[i][t] < A[i][t-1] + nrA[i][t])
			   A[i][t] = A[i][t-1] + nrA[i][t];
		    }
		}
	}

     for (i = 1; i <= P; i++)
     {
	 fscanf(fin, "%d %d", &a, &b);
	fprintf(fout, "%d\n", A[a][b]);
     }
     fclose(fin);
     fclose(fout);

     return 0;
}