Pagini recente » Cod sursa (job #2961401) | Cod sursa (job #697581) | Cod sursa (job #2575682) | Cod sursa (job #1529962) | Cod sursa (job #1876400)
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>
#define tMax 3501
#define nMax 151
#define mMax 1501
#define pMax 8001
#define pb push_back
#define mkp make_pair
#define x first
#define y second
using namespace std;
ifstream fin("amenzi.in");
ofstream fout("amenzi.out");
int n, m, k, p;
int dp[tMax][nMax], Sol[pMax], vDp[nMax];
pair<pair<int, int>, int> edges[mMax];
vector<pair<int, int> > crime[tMax];
vector<pair<int, int> > meet[tMax];
int main()
{
int a, b, c;
fin>>n>>m>>k>>p;
for(int i=1; i<=m; i++)
{
fin>>a>>b>>c;
edges[i]=mkp(mkp(a, b), c);
}
for(int i=1; i<=k; i++)
{
fin>>a>>b>>c;
crime[b].pb(mkp(a, c));
}
for(int i=1; i<=p; i++)
{
fin>>a>>b;
meet[b].pb(mkp(a, i));
}
for(int i=1; i<=n; i++)
for(int j=0; j<tMax; j++)
dp[j][i]=-1;
dp[0][1]=0;
for(int time=0; time<tMax; time++)
{
memset(vDp, -1, sizeof(vDp));
if(time)
{
for(int i=1; i<=m; i++)
{
int node1=edges[i].x.x, node2=edges[i].x.y, cost=edges[i].y;
if(cost<=time && dp[time-cost][node1]!=-1)
vDp[node2]=max(vDp[node2], dp[time-cost][node1]);
if(cost<=time && dp[time-cost][node2]!=-1)
vDp[node1]=max(vDp[node1], dp[time-cost][node2]);
}
for(int i=1; i<=n; i++)
{
dp[time][i]=vDp[i];
dp[time][i]=max(dp[time][i], dp[time-1][i]);
}
}
for(vector<pair<int, int> >::iterator it=crime[time].begin(); it!=crime[time].end(); it++)
{
int node=it->first, cost=it->second;
if(dp[time][node]!=-1)
dp[time][node]+=cost;
}
for(vector<pair<int, int> >::iterator it=meet[time].begin(); it!=meet[time].end(); it++)
{
int node=it->first, poz=it->second;
Sol[poz]=dp[time][node];
}
}
for(int i=1; i<=p; i++)
fout<<Sol[i]<<'\n';
}