Pagini recente » Cod sursa (job #3161684) | Cod sursa (job #267639) | Cod sursa (job #1244618) | Cod sursa (job #2186233) | Cod sursa (job #11487)
Cod sursa(job #11487)
#include <stdio.h>
#define in "amenzi.in"
#define out "amenzi.out"
int a[3501][151], t[3501][151];
//bool sel[3501][151];
int x, timp;
int n, m, k, p;
typedef struct nod {
int vf, tp;
nod* next;
} *PNOD;
PNOD graph[151];
void ReadData();
void Solve();
void Add(int,int,int);
int main()
{
ReadData();
return 0;
}
void ReadData()
{
int c,d,e;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d%d%d%d", &n,&m,&k,&p);
for ( int i = 1; i <= m; i++ )
{
scanf("%d%d%d",&c,&d,&e);
Add(c,d,e);
Add(d,c,e);
}
for ( int i = 1; i <= k; i++ )
{
scanf("%d%d%d",&c,&d,&e);
t[d][c] = e;
}
Solve();
for ( int i = 1; i <= p; i++ )
{
scanf("%d%d",&x,&timp);
printf("%d\n",a[timp][x]);
}
/* for ( int i = 1; i <= 50; i++ )
{
for ( int j = 1; j <= n; j++ )
{
printf("%d ",a[i][j] );
}
printf("\n");
}*/
}
void Add(int i, int j, int c)
{
PNOD q = new nod;
q->vf = i;
q->tp = c;
q->next = graph[j];
graph[j] = q;
}
void Solve()
{
for ( int i = 1; i <= 3501; i++ )
for ( int j = 1; j <= n; j++ )
a[i][j] = -1;
a[1][1] = t[1][1];
for ( int i = 1; i < 3501; i++ )
{
if ( a[i+1][1] < a[i][1] + t[i+1][1] ) a[i+1][1] = a[i+1][1];
}
for ( PNOD q = graph[1]; q; q=q->next )
{
a[q->tp][q->vf] = t[q->tp][q->vf] + a[1][1];
}
for ( int i = 1; i <= 3501; i++ )
{
for ( int j = 1; j <= n; j++ )
{
if ( a[i][j] > -1 )
{
if ( a[i+1][j] < a[i][j] + t[i+1][j] || a[i+1][j] == -1 ) a[i+1][j] = a[i][j] + t[i+1][j];
for ( PNOD q = graph[j]; q; q=q->next )
{
if ( i+q->tp > 3501 ) continue;
if ( a[i+q->tp][q->vf] < a[i][j] + t[i+q->tp][q->vf] || a[i+q->tp][q->vf] == -1 )
{
a[i+q->tp][q->vf] = a[i][j] + t[i+q->tp][q->vf];
}
}
}
}
}
}