Cod sursa(job #551891)

Utilizator ConsstantinTabacu Raul Consstantin Data 11 martie 2011 11:55:18
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<vector>
#define Nmax 155
#define Tmax 3505
#define max(a,b) a>b?a:b
using namespace std;
vector< pair<int,int> > v[ Nmax ];
int x[ Nmax ][ Tmax ],cost[ Nmax ][ Tmax ],i,j,k,l,m,n,p;

bool viz[ Nmax ][ Tmax ];

void citire(){
freopen("amenzi.in","r",stdin);
scanf("%d %d %d %d",&n,&m,&k,&p);

int i,a,b,c;
for(i = 1 ;i <= m ; i++)
	{scanf("%d %d %d",&a,&b,&c);
	v[a].push_back(make_pair(b,c));
	v[b].push_back(make_pair(a,c));
	}
for(i = 1; i<= k ; i++)
	{scanf("%d %d %d",&a,&b,&c);
	cost[ a ][ b ] += c;
	}

}

int supremum(int nod,int T){
int i,N,sol = -1,X,t;
N = v[ nod].size();

for(i = 0 ; i< N;i++)
	{X = v[nod][i].first;
	t = v[nod][i].second;
	
	if(T >= t )
			sol = max(sol,x[ X ][ T- t]);
	}
return sol;

}


void solve(){

int i,j,sum;
bool ok;

for(i = 1;i <= n ;i++)
	x[i][0] = -1;
x[1][0]=0;

for(j = 1; j <= Tmax ; j++)
	for(i = 1; i <= n; i++)
		{
		sum = supremum(i,j);
		x[i][j] = x[i][j-1];
		x[i][j] = max(x[i][j],sum);
		if(x[i][j] != -1)
			x[i][j] += cost[i][j];
			
		}
	
}

void afisare(){
freopen("amenzi.out","w",stdout);
int i,a,b;

for(i = 1; i <= p; i++)
	{scanf("%d %d",&a,&b);
	printf("%d\n",x[a][b]);
	}
}



int main(){

	
citire();
solve();
afisare();


return 0;}