Pagini recente » Cod sursa (job #2068700) | Cod sursa (job #1691) | Cod sursa (job #1559751) | Cod sursa (job #442066) | Cod sursa (job #426091)
Cod sursa(job #426091)
#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];if(din[t][i]!=inf&&Am[t][i]) din[t][i]+=Am[t][i];}
for(i=1;i<=n;i++)
{
for(j=0;j<gr[i];j++)
{
if(t-C[i][j]<0||din[t-C[i][j]][i]==-inf)
continue;
nod=G[i][j];
din[t][nod]=max(din[t][nod],din[t-C[i][j]][i]+Am[t][nod]);
}
}
}
}
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;
}