Pagini recente » Cod sursa (job #676461) | Cod sursa (job #283298) | Cod sursa (job #1820402) | Cod sursa (job #848701) | Cod sursa (job #920200)
Cod sursa(job #920200)
#include<stdio.h>
#define inf (1<<29)
#define maxn 153
#define maxt 3500
FILE*f=fopen("amenzi.in","r");
FILE*g=fopen("amenzi.out","w");
int n,m,k,q;
int dist[maxn][maxn],S[maxt+5][maxn],D[maxt+5][maxn];
inline int min ( const int &a , const int &b ){
return a <= b ? a : b;
}
inline int max ( const int &a , const int &b ){
return a >= b ? a : b;
}
int main () {
fscanf(f,"%d %d %d %d",&n,&m,&k,&q);
for ( int i = 1 ; i <= n ; ++i ){
for ( int j = 1 ; j <= n ; ++j ){
dist[i][j] = inf;
}
}
int x,y,c;
for ( int i = 1 ; i <= m ; ++i ){
fscanf(f,"%d %d %d",&x,&y,&c);
dist[x][y] = dist[y][x] = min(dist[x][y],c);
}
for ( int p = 1 ; p <= n ; ++p ){
for ( int i = 1 ; i <= n ; ++i ){
for ( int j = 1 ; j <= n ; ++j ){
if ( dist[i][j] > dist[i][p] + dist[p][j] ){
dist[i][j] = dist[i][p] + dist[p][j];
}
}
}
}
for ( int i = 1 ; i <= k ; ++i ){
fscanf(f,"%d %d %d",&x,&y,&c);
S[y][x] += c;
}
for ( int i = 0 ; i <= maxt ; ++i ){
for ( int j = 1 ; j <= n ; ++j ){
D[i][j] = -1;
}
}
D[0][1] = 0;
for ( int t = 0 ; t < maxt ; ++t ){
for ( int i = 1 ; i <= n ; ++i ){
if ( D[t][i] == -1 ) continue ;
D[t][i] += S[t][i];
D[t+1][i] = max(D[t+1][i],D[t][i]);
if ( S[t][i] || i == 1 ){
for ( int j = 1 ; j <= n ; ++j ){
int nextt = t+dist[i][j];
D[nextt][j] = max(D[nextt][j],D[t][i]);
}
}
}
}
for ( int i = 1 ; i <= q ; ++i ){
fscanf(f,"%d %d",&x,&y);
fprintf(g,"%d\n",D[y][x]);
}
fclose(f);
fclose(g);
return 0;
}