Pagini recente » Cod sursa (job #2757847) | Cod sursa (job #556712) | Cod sursa (job #1328070) | Cod sursa (job #1466305) | Cod sursa (job #780222)
Cod sursa(job #780222)
#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;
}