Cod sursa(job #927587)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 25 martie 2013 21:28:35
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#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;
}