Pagini recente » Cod sursa (job #2582752) | Cod sursa (job #2352282) | Cod sursa (job #218782) | Cod sursa (job #399288) | Cod sursa (job #780220)
Cod sursa(job #780220)
#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;
}