Cod sursa(job #29049)

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

long long N, M, K, P;
long long A[MaxN][MaxT];
long long nrA[MaxN][MaxT];
long long e[2000][3], nrM;

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

    long long 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, "%lld %lld", &a, &b);
          fprintf(fout, "%lld\n", A[a][b]);
     }
     fclose(fin);
     fclose(fout);

     return 0;
}