Cod sursa(job #551820)

Utilizator ConsstantinTabacu Raul Consstantin Data 11 martie 2011 10:11:40
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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 ] = max(c,sol[a][b]);
	}

}

int supremum(int nod,int T,bool &ok){
int i,N,sol = 0,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 )
		if(viz[X][ T - t])
			{sol = max(sol,x[ X ][ T- t]);
			ok = true;}
	}
return sol;

}


void solve(){
viz[ 1 ][ 0 ] = true;

int i,j,sum;
bool ok;
for(j = 1; j <= Tmax ; j++)
	for(i = 1; i <= n; i++)
		{ok = false;
		sum = supremum(i,j,ok);
		if(ok || viz[i][j-1])
			{x[i][j] = max(x[i][j-1],sum) + cost[i][j];
			viz[i][j] = true;
			}
		}
	
}

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

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



int main(){

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


return 0;}