Pagini recente » Cod sursa (job #918325) | Cod sursa (job #1763141) | Cod sursa (job #215025) | Cod sursa (job #159985) | Cod sursa (job #1087576)
#include<fstream>
#include<vector>
using namespace std;
ifstream in("amenzi.in"); ofstream out("amenzi.out");
struct arc{
int nod,cost;
};
vector <arc> l[151];
int a[3505][151],b[3505][151];
int n,m,p,k,x,y,t,v,c;
int main(){
in>>n>>m>>k>>p;
for(int i=1;i<=m;++i){
in>>x>>y>>c;
l[x].push_back((arc){y,c});
l[y].push_back((arc){x,c});
}
for(int i=1;i<=k;++i){
in>>x>>t>>v;
b[t][x]+=v; //in nodul x la momentul t are loc o infractiune
}
for(int i=0;i<=3501;++i) for(int j=0;j<=n;++j) a[i][j]=-1;
a[0][1]=b[0][1]; //Daca la timpul 0 am o infractiune in punctul de start, vine garcea si amendeaza
for(int i=1;i<=3501;++i){ //pentru fiecare moment de timp
for(int j=1;j<=n;++j){ //pentru fiecare nod in parte
a[i][j]=a[i-1][j]; //consider ca Garcea sta aici si mananca seminte si apoi vad daca pleaca in aventura in alt nod
for(vector <arc> :: iterator it=l[j].begin(); it!=l[j].end(); ++it){
if(i-(*it).cost>=0) //vad daca as fi putut ajunge in nodul curent din alt nod vecin
a[i][j]=max(a[i][j],a[i-(*it).cost][(*it).nod]); //si vad exact din care vecin a venit
}
if( a[i][j]!=-1) a[i][j]+=b[i][j]; //daca sa putut ajunge aici, dau si amenda respectiva
}
}
//a[i][j] va fi deci amenda totala maxima data in timpul i, terminand in nodul j
for(int i=1;i<=p;++i){
in>>x>>y;
out<<a[y][x]<<'\n';
}
}