Pagini recente » Cod sursa (job #1914329) | Cod sursa (job #1033581) | Cod sursa (job #1675321) | Cod sursa (job #1527091) | Cod sursa (job #426101)
Cod sursa(job #426101)
#include <cstdio>
using namespace std;
#define nmax 153
#define tmax 3505
#define inf 1<<20
int n,m,p,k;
FILE *f=fopen("amenzi.in","r");
FILE *g=fopen("amenzi.out","w");
int G[nmax][nmax],C[nmax][nmax];
int Am[nmax][nmax];
int din[tmax][nmax];
int gr[nmax];
inline int max(int x,int y)
{
if(x>y) return x;
return y;
}
void read()
{
int x,y,i,c;
fscanf(f,"%d %d %d %d",&n,&m,&k,&p);
for(i=1;i<=m;i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
G[x][gr[x]]=y;
C[x][gr[x]]=c;
G[y][gr[y]]=x;
C[y][gr[y]]=c;
++gr[x];
++gr[y];
}
for(i=1;i<=k;i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
Am[y][x]+=c; //la timpul y din intersectia x,amenda creste cu c
}
}
void dinamic()
{
int t,i,j,nod;
for(t=0;t<=tmax;t++)for(i=1;i<=n;i++) din[t][i]=-inf;
din[0][1]=Am[0][1];
for(t=1;t<=tmax-5;t++)
{
for(i=1;i<=n;i++)
{
din[t][i]=din[t-1][i];
for(j=0;j<gr[i];j++)
{
nod=G[i][j];
if(t-C[i][j]<0||din[t-C[i][j]][nod]==-inf)
continue;
din[t][i]=max(din[t][i],din[t-C[j][i]][nod]);
}
if(Am[t][i]&&din[t][i]!=-inf)
din[t][i]+=Am[t][i];
}
}
}
int main()
{
int x,y;
read();
dinamic();
for(int i=1;i<=p;i++)
{
fscanf(f,"%d %d",&x,&y);
fprintf(g,"%d\n",din[y][x]);
}
return 0;
}