Pagini recente » Cod sursa (job #1852813) | Cod sursa (job #737042) | Cod sursa (job #1239979) | Cod sursa (job #2733146) | Cod sursa (job #11824)
Cod sursa(job #11824)
#include <stdio.h>
#include <fstream>
using namespace std;
#define in "amenzi.in"
#define out "amenzi.out"
int a[3502][151];
int t[3502][151];
int cost[151][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 main()
{
ReadData();
return 0;
}
void ReadData()
{
int c,d,e;
for ( int i = 0; i <= 3501; i++ )
for ( int j = 0; j <= n; j++ )
{
t[i][j] = 0;
a[i][j] = -1;
}
for ( int i = 1; i <= n; i++ )
for ( int j = 1; j <= n; j++ )
cost[i][j] = 0;
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);
if ( cost[c][d] == 0 ) Add(c,d), Add(d,c);
if ( cost[c][d] == 0 || cost[c][d] > e ) cost[c][d] = cost[d][c] = e;
}
for ( int i = 1; i <= k; i++ )
{
scanf("%d%d%d",&c,&d,&e);
if ( t[d][c] == 0 || t[d][c] < 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 = 0; i <= 50; i++ )
{
for ( int j = 1; j <= n; j++ )
{
printf("%d ",t[i][j] );
}
printf("\n");
}*/
}
void Add(int i, int j)
{
PNOD q = new nod;
q->vf = i;
q->next = graph[j];
graph[j] = q;
}
void Solve()
{
for ( int i = 0; i <= 3501; i++ )
{
for ( int j = 1; j <= n; j++ )
{
a[i][j] = -1;
}
}
a[0][1] = t[0][1];
/* for ( int i = 0; i < 3501; i++ )
{
if ( a[i+1][1] < a[i][1] + t[i+1][1] ) a[i+1][1] = a[i][1] + t[i+1][1];
}
for ( PNOD q = graph[1]; q; q=q->next )
{
int k = cost[1][q->vf];
if ( a[k][q->vf] < t[k][q->vf] + a[0][1] ) a[k][q->vf] = t[k][q->vf] + a[0][1];
} */
for ( int i = 0; i <= 3501; i++ )
{
for ( int j = 1; j <= n; j++ )
{
if ( a[i][j] != -1 )
{
int k;
if ( i+1 < 3500 && a[i+1][j] < a[i][j] + t[i+1][j] ) a[i+1][j] = a[i][j] + t[i+1][j];
for ( PNOD q = graph[j]; q; q=q->next )
{
k = cost[j][q->vf];
if ( i+k > 3501 ) continue;
if ( a[i+k][q->vf] < a[i][j] + t[i+k][q->vf] )
{
a[i+k][q->vf] = a[i][j] + t[i+k][q->vf];
}
}
}
}
}
/*
for ( int i = 0; 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 )
{
int k = cost[j][q->vf];
if ( i+k > 3501 ) continue;
if ( ( a[i+k][q->vf] < a[i][j] + t[i+k][q->vf] ) || ( a[i+k][q->vf] == -1 ) )
{
a[i+k][q->vf] = a[i][j] + t[i+k][q->vf];
}
}
}
}
}*/
}