Cod sursa(job #780220)

Utilizator vendettaSalajan Razvan vendetta Data 20 august 2012 01:10:41
Problema Amenzi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("amenzi.in");
ofstream g("amenzi.out");

#define nmax 155
#define Tmax 3502

int n, m, K, P, a[nmax][nmax], amenda[nmax][Tmax], dp[Tmax][nmax], B[Tmax][nmax];

void citeste(){

	f >> n >> m >> K >> P;
	for(int i=1; i<=m; i++){
        int x,y, z;
        f >> x >> y >> z;
        a[x][y] = z;
        a[y][x] = z;
	}
    for(int i=1; i<=K; i++){
        int x, y, z;
        f >> x >> y >> z;
        amenda[x][y] = z;//amenda la intersectia x in momentul y
    }
}


void rezolva(){

    //dp[T][i] = suma maxim aflandu-ma la momentul T in orasul i;

    for(int i=0; i<Tmax; i++) for(int j=1; j<=n; j++) dp[i][j] = -1, B[i][j] = -1;
    dp[0][1] = amenda[1][0];
    B[0][1] = amenda[1][0];

    for(int i=1; i<Tmax; i++){//ma aflu la momentul i
        for(int j=1; j<=n; j++){//in intersectia j
            //if (a[j][1] < i && a[j][1] != 0) dp[i][j] = dp[0][1];//acum merge din 1 in j; la momentul i din momentul 0
            dp[i][j] = max(dp[i][j], dp[i-1][j]); //sta pe loc
            for(int k=1; k<=n; k++){
                if (k == j || a[k][j] == 0 ) continue;//daca nu exista muchiede la k la j
                int X = a[j][k];//distanta de la j la k
                int Max = -1;
                //for(int w=0; w<=i-X; w++){//si acum continui o stare cand ma aflam in orasul k la momentul 0,i-x; pt ca eu vreau ca la i sa fiu in k
                  //  Max = max(Max, dp[w][k]);
                //}
                if (i-X >= 0) Max = B[i-X][k];
                dp[i][j] = max(dp[i][j], Max);
            }
            if (dp[i][j] != -1) dp[i][j] += amenda[j][i];
            B[i][j] = max(B[i-1][j], dp[i][j]);
        }

    }

    for(int i=1; i<=P; i++){
        int x, y; // sa se intalneaza in x la momentul y
        f >> x >> y;
        g << dp[y][x] << "\n";
    }

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}