Cod sursa(job #549466)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 8 martie 2011 16:51:10
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<vector>
#define Nmax 152
#define Tmax 3502
#define dest first
#define cost second
using namespace std;
int N,M,K,P;
int inf[Nmax][Tmax],sol[Nmax][Tmax],viz[256],dist[Nmax];
vector <pair <int,int> > a[Nmax];

void citeste_muchii(){
	for(;M;--M){
		int x,y,c;
		scanf("%d%d%d",&x,&y,&c);
		a[x].push_back(make_pair(y,c));
		a[y].push_back(make_pair(x,c));
	}
	
}

void citeste_amenzi(){
	for(;K;--K){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		inf[a][b]+=c;
	}
}

void calculeaza(){
	viz[1]=1;
	sol[1][0]=inf[1][0];
	memset(dist,0x3f3f3f3f,sizeof(dist));
	dist[1]=0;
	for(int timp=1;timp<=Tmax;++timp)
		for(int i=1;i<=N;++i)
		{  if(viz[i]){
			for(size_t p=0;p<a[i].size();++p){
			if(timp - a[i][p].cost >=0){
			viz[a[i][p].dest]=1;
			sol[i][timp]=max( sol[i][timp] , sol[ a[i][p].dest ] [ timp- a[i][p].cost] );}
			dist[a[i][p].dest]=min(dist[a[i][p].dest],dist[i]+a[i][p].cost);
			}
		  sol[i][timp]=max( sol[i][timp] , sol[i][timp-1] );
		  if(dist[i]<=timp)
		  sol[i][timp]+=inf[i][timp];
		}
		}
}

void afiseaza_sol(){
	for(;P;--P){
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",sol[a][b]);		
	}
}

int main(){
	
	freopen("amenzi.in","r",stdin);
	freopen("amenzi.out","w",stdout);
	
	scanf("%d%d%d%d",&N,&M,&K,&P);
	
	citeste_muchii();
	citeste_amenzi();
	calculeaza();
	afiseaza_sol();
	
return 0;
}