Cod sursa(job #551878)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 11 martie 2011 11:34:17
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<vector>
#define Nmax 155
#define Tmax 3500
using namespace std;

int A[Nmax][Tmax+10], Amenda[Nmax][Tmax+10] ; 
bool viz[Nmax][Tmax+10] ; 

int n,i,j,N,K,a,b,t,k,fiu,m,P ;

vector< pair<int, int> > G[Nmax] ; 

int main()
{
	freopen("amenzi.in","r",stdin);
	freopen("amenzi.out","w",stdout);
	
	scanf("%d %d %d %d",&n,&m,&K,&P);
	
	for( i = 1 ; i <= m ; i++ )
	{
		scanf("%d %d %d",&a,&b,&t) ; 
		
		G[a].push_back(make_pair(b,t));
		G[b].push_back(make_pair(a,t));
	}
	
	for( i = 1 ; i <= K ; i++ )
	{
		scanf("%d %d %d",&a,&b,&t);
		Amenda[a][b] = t ;
	}
	
	viz[1][0] = true ; 
	
	for( j = 1 ; j <= Tmax ; j++ ) 
		for( i = 1 ; i <= n ; i++ )
		{
			if( viz[i][j-1] ) 
			{
				A[i][j] = A[i][j-1] ;
				viz[i][j] = true ; 
			}
			
			N = G[i].size() ; 
			
			for( k = 0 ; k < N ; k++ )
			{
				fiu = G[i][k].first ; 
				t = G[i][k].second ; 
				
				if( j >= t && viz[fiu][j-t] && A[fiu][j-t] >= A[i][j] ) 
				{
					A[i][j] = A[fiu][j-t] ;
					viz[i][j] = true ; 
				}
			}
			
			if( viz[i][j] ) A[i][j] += Amenda[i][j] ; 
		}
	
	for( i = 1 ; i <= P ; i++ )
	{
		scanf("%d %d",&a,&b);
		
		if( viz[a][b] ) 
			printf("%d\n",A[a][b]);
		else 
			printf("-1\n");
	}
	
	return 0 ; 
}