Pagini recente » Cod sursa (job #1163863) | Cod sursa (job #2949014) | Cod sursa (job #2390417) | Cod sursa (job #981457) | Cod sursa (job #1027808)
#include <iostream>
#include <fstream>
#include <vector>
#define NMax 152
#define TMax 3505
#define lim 1000000
#define Next ++position == lim?f.read(buffer, lim), position = 0:0
using namespace std;
int position;
char buffer[lim];
ifstream f ("amenzi.in");
int n, m, nrinfractiuni, nrsotii;
int amenda[TMax][NMax];
struct graph
{
int node, cost;
graph() {node = cost = 0;}
graph(const int _node, const int _cost) {node = _node, cost = _cost;}
};
vector <graph> G[NMax];
int best[TMax][NMax];
inline void Read(int &x)
{
for (;buffer[position] < '0' || buffer[position] > '9'; Next);
for (x = 0; '0' <= buffer[position] && buffer[position] <= '9'; x = x*10 + buffer[position] - '0', Next);
}
void Read()
{
Read(n), Read(m), Read(nrinfractiuni), Read(nrsotii);
int i, x, y, cost;
for (i=1; i<=m; ++i)
{
Read(x), Read(y), Read(cost);
G[x].push_back(graph(y, cost));
G[y].push_back(graph(x, cost));
}
for (i=1; i<=nrinfractiuni; ++i)
{
Read(x), Read(y), Read(cost);
amenda[y][x] += cost;
/**
la intersectia x se da la timpul y o amenda care costa cost bani
amenda[y][x] = numarul total de amenzi care se pot da la timpul y la intersectia x
*/
}
}
void Init()
{
int i, j;
for (i=0; i<=3500; ++i)
for (j=1; j<=n; ++j)
best[i][j] = -1;
}
void MakeDP()
{
Init();
int i, j;
best[0][1] = amenda[0][1];
for (i=1; i<=3500; ++i)
{
for (j=1; j<=n; ++j)
{
best[i][j] = max(best[i][j], best[i-1][j]);
vector <graph>::iterator it, final;
graph aux;
for (it = G[j].begin(), final = G[j].end(); it!=final; ++it)
{
aux = *it;
if (i - aux.cost >= 0)
best[i][j] = max(best[i][j], best[i-aux.cost][aux.node]);
}
if (best[i][j] == -1)
continue;
best[i][j] += amenda[i][j];
}
}
}
void Write()
{
ofstream g("amenzi.out");
int i, x, y;
for (i=1; i<=nrsotii; ++i)
{
/// se intalneste cu sotia in intersectia x la timpul y
Read(x), Read(y);
g<<best[y][x]<<"\n";
}
g.close();
}
int main()
{
Read();
MakeDP();
Write();
return 0;
}