Cod sursa(job #780222)

Utilizator vendettaSalajan Razvan vendetta Data 20 august 2012 01:14:50
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <vector>
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];
vector<pair<int,int> > gf[nmax];

void citeste(){

	f >> n >> m >> K >> P;
	for(int i=1; i<=m; i++){
        int x,y, z;
        f >> x >> y >> z;
        gf[x].push_back(make_pair(y,z));
        gf[y].push_back(make_pair(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
            dp[i][j] = max(dp[i][j], dp[i-1][j]); //sta pe loc
            for(int k=0; k<gf[j].size(); k++){
                int vc = gf[j][k].first;
                int X = gf[j][k].second;
                if (i-X >= 0){ //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
                    dp[i][j] = max(dp[i][j], B[i-X][vc]);
                }
            }
            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;

}