Pagini recente » Cod sursa (job #686540) | Cod sursa (job #1353702) | Cod sursa (job #815831) | Cod sursa (job #2863600) | Cod sursa (job #2824069)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("amenzi.in");
ofstream fout("amenzi.out");
struct heapNode {
int nod, cost;
inline bool operator < (const heapNode &other) const
{
return cost > other.cost;
}
};
struct node {
int nod, cost;
};
const int maxN = 150, maxT = 3500;
int nr_noduri, nr_muchii, nr_crime, nr_momente, dist[maxN + 5];
int amenda[maxN + 5][maxT + 5], dp[maxN + 5][maxT + 5];
vector <node> G[maxN + 5];
priority_queue <heapNode> heap;
bool used[maxN + 5];
void dijkstra()
{
heap.push({1, 0});
while(!heap.empty())
{
heapNode curr = heap.top();
heap.pop();
if(used[curr.nod])
continue;
used[curr.nod] = 1;
for(node vecin : G[curr.nod])
{
if(dist[vecin.nod] == 0 || dist[curr.nod] + vecin.cost < dist[vecin.nod])
{
dist[vecin.nod] = dist[curr.nod] + vecin.cost;
heap.push({vecin.nod, dist[vecin.nod]});
}
}
}
}
int main()
{
fin >> nr_noduri >> nr_muchii >> nr_crime >> nr_momente;
for(int i = 1; i <= nr_muchii; i++)
{
node a, b;
fin >> a.nod >> b.nod >> a.cost;
b.cost = a.cost;
G[a.nod].push_back(b);
G[b.nod].push_back(a);
}
for(int i = 1; i <= nr_crime; i++)
{
int loc, timp, val;
fin >> loc >> timp >> val;
amenda[loc][timp] = val;
}
memset(dp, -1, sizeof dp);
dp[1][0] = 0;
for(int j = 1; j <= maxT; j++)
{
for(int i = 1; i <= nr_noduri; i++)
{
dp[i][j] = dp[i][j - 1];
for(node next : G[i])
if(next.cost <= j)
dp[i][j] = max(dp[i][j], dp[next.nod][j - next.cost]);
if(dp[i][j] != -1)
dp[i][j] += amenda[i][j];
}
}
for(int i = 1; i <= nr_momente; i++)
{
int loc, timp;
fin >> loc >> timp;
fout << dp[loc][timp] << '\n';
}
return 0;
}