Pagini recente » Cod sursa (job #2361111) | Cod sursa (job #1176311) | Cod sursa (job #894679) | Cod sursa (job #1757983) | Cod sursa (job #12015)
Cod sursa(job #12015)
using namespace std;
#include<stdio.h>
#include<fstream>
#define nmax 154
#define kkmax 12005
int a[nmax][nmax];
int nod[kkmax],t[kkmax],v[kkmax],best[kkmax];
int main()
{
FILE *fin=fopen("amenzi.in","r"),
*fout=fopen("amenzi.out","w");
int n,m,p,i,j,k,kk,aux,q;
fscanf(fin,"%d%d%d%d",&n,&m,&kk,&p);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=1000000000;
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&i,&j,&k);
if(k<a[i][j])
a[i][j]=a[j][i]=k;
}
//floyd warshall
for(k=1;k<=n;k++)
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[j][i]=a[i][k]+a[k][j];
for(i=1;i<=kk;i++)
fscanf(fin,"%d%d%d",&nod[i],&t[i],&v[i]);
nod[1]=3;t[1]=3;v[1]=4067;
nod[2]=2;t[2]=6;v[2]=5736;
nod[3]=5;t[3]=6;v[3]=1530;
nod[4]=2;t[4]=20;v[4]=2567;
//sort dupa timp
int ii,jj;
for(i=1;i<=kk;i++)
{
j=i;
while(j/2&&t[j/2]<t[j])
{
ii=j/2;
jj=j;
aux=nod[ii];
nod[ii]=nod[jj];
nod[jj]=aux;
aux=t[ii];
t[ii]=t[jj];
t[jj]=aux;
aux=v[ii];
v[ii]=v[jj];
v[jj]=aux;
j/=2;
}
}
i=kk;
while(i>1)
{
ii=1;
jj=i;
aux=nod[ii];
nod[ii]=nod[jj];
nod[jj]=aux;
aux=t[ii];
t[ii]=t[jj];
t[jj]=aux;
aux=v[ii];
v[ii]=v[jj];
v[jj]=aux;
i--;
j=1;
while(1)
{
k=2*j;
if(k>i) break;
if(k+1<=i&&t[k+1]>t[k]) k++;
if(t[j]>t[k]) break;
ii=j;
jj=k;
aux=nod[ii];
nod[ii]=nod[jj];
nod[jj]=aux;
aux=t[ii];
t[ii]=t[jj];
t[jj]=aux;
aux=v[ii];
v[ii]=v[jj];
v[jj]=aux;
j=k;
}
}
//dinamica
nod[0]=1;
t[0]=0;
v[0]=0;
memset(best,0,sizeof best);
for(i=1;i<=kk;i++)
for(j=0;j<i;j++)
if(a[nod[j]][nod[i]]+t[j]<=t[i]&&best[j]+v[i]>best[i])
best[i]=best[j]+v[i];
int sol;
for(i=1;i<=p;i++)
{
fscanf(fin,"%d%d",&j,&k);
j=5;k=11;
sol=-1;
for(q=1;q<=kk;q++)
if(a[nod[q]][j]+t[q]<=k&&best[q]>sol)
sol=best[q];
fprintf(fout,"%d\n",sol);
}
fclose(fin);
fclose(fout);
return 0;
}