Pagini recente » Cod sursa (job #880290) | Cod sursa (job #1209586) | Cod sursa (job #2115474) | Cod sursa (job #141803) | Cod sursa (job #780229)
Cod sursa(job #780229)
#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, amenda[nmax][Tmax], dp[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 maxima aflandu-ma la momentul T in orasul i;
//B[T][i] = suma maxima pana in momentul T fiind in orasul i(dar e echivalent cu dp[T][i]);
//initial nu pot ajunge nicaieri
for(int i=0; i<Tmax; i++)
for(int j=1; j<=n; j++) dp[i][j] = -1;
dp[0][1] = amenda[1][0];//in caz ca poate amenda pe cineva la momentul o fiind in orasul 1
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++){//verific fiecare vecin; incercand sa-l continui
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 vc la momentul [0,i-x]; pt ca eu vreau ca la i sa fiu in k
dp[i][j] = max(dp[i][j], dp[i-X][vc]); // doar daca distanta dintre vc si i <= X;
}
}
if (dp[i][j] != -1) dp[i][j] += amenda[j][i];// doar daca am reusit sa ajung de undeva in orasul j la momentul i(indiferent cu ce cost :D)
}
}
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;
}