Pagini recente » Cod sursa (job #323462) | Cod sursa (job #2164203) | Cod sursa (job #808454) | Cod sursa (job #2151701) | Cod sursa (job #927587)
Cod sursa(job #927587)
#include<fstream>
using namespace std;
#define max_t 3501
#define max_n 155
#define inf 1000000000
ifstream f("amenzi.in");
ofstream g("amenzi.out");
int a , b , c , nod2 , cost , n , m , k , p;
int A[max_n][max_t] , D[max_n][max_t] , Dist[max_n][max_n];
inline int maxim(int a , int b){
return a>b?a:b;
}
inline int minim(int a , int b){
return a<b?a:b;
}
void read(){
for(int i = 1 ; i <= m ; i++){
f>>a>>b>>c;
Dist[a][b] = Dist[b][a] = minim(Dist[a][b] , c);
}
for(int i = 1 ; i <= k ; i++){
f>>a>>b>>c;
A[a][b] += c;
}
}
void initializare(){
for(int i = 1 , j ; i <= n ; i++)
for(j = 1 ; j <= n ; j++)
Dist[i][j] = inf;
for(int i = 1 ; i <= n ; i++)
for(int j = 0 ; j < max_t ; j++)
D[i][j] = -1;
D[1][0] = 0;
}
void solve(){
int i , j , p;
for(p = 1 ; p <= n ; p++)
for(i = 1 ; i <= n ; i++)
for(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 j = 0 , i , k ; j < max_t ; j++){
for(i = 1 ; i <= n ; i++){
if( D[i][j] == (-1) ) continue;
D[i][j] += A[i][j];
D[i][j+1] = maxim(D[i][j+1] , D[i][j]);
if(A[i][j]||i==1)
for(k = 1 ; k <= n ; k++){
cost = Dist[i][k];
if(cost+j >= max_t) continue;
D[k][j+cost] = maxim(D[k][j+cost] , D[i][j]);
}
}
}
}
void print(){
for(int i = 1 ; i <= p ; i++){
f>>a>>b;
g<<D[a][b]<<"\n";
}
}
int main(){
f>>n>>m>>k>>p;
initializare();
read();
solve();
print();
return 0;
}