Pagini recente » Cod sursa (job #105145) | Cod sursa (job #1684184) | Cod sursa (job #2109253) | Cod sursa (job #3260421) | Cod sursa (job #426117)
Cod sursa(job #426117)
#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,c;
for(i=1;i<=n;i++) din[0][i]=-1;
din[0][1]=0;
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];
c=C[i][j];
if(t-c>=0||din[t-c][nod]!=-1)
din[t][i]=max(din[t][i],din[t-c][nod]);
}
if(Am[t][i]&&din[t][i]!=-1)
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;
}