Cod sursa(job #42182)

Utilizator blasterzMircea Dima blasterz Data 28 martie 2007 22:23:37
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int dp[151][3501];
bool sotie[151][3501];

struct nod { int x, c; nod(){}; nod(int a, int b){x=a; c=b;};};
vector<vector<nod> >a;

int hot[151][3501];


int N, M, K, P;
void citire()
{
	freopen("amenzi.in", "r", stdin);
	scanf("%d %d %d %d\n", &N, &M, &K, &P);
	int i, p, q, c;
	a.resize(N+1);
	for(i=1;i<=M;i++)
	{
		scanf("%d %d %d\n", &p, &q, &c);
		a[p].push_back(nod(q, c));
		a[q].push_back(nod(p, c));
	}
	for(i=1;i<=K;i++)
	{
		scanf("%d %d %d\n", &p, &q, &c);
		hot[p][q]=c;
	}
	for(i=1;i<=P;i++) 
	{
		scanf("%d %d\n", &p, &q);
		sotie[p][q]=1;
	}
}

struct nd { int c; bool ajuns; nd(int a, bool b){c=a; ajuns=b;};};
bool ajuns[151][3501];

nd memo(int i, int j)
{
	//printf("(%d %d)\n", i, j);
	if(i==1 && j==0) return nd(dp[i][j]+hot[i][j], 1);
	if(j<=0)return nd(0,0);
//	if(sotie[i][j]) return dp[i][j];
	if(dp[i][j]) return nd(dp[i][j],ajuns[i][j]) ;
	int k;
	
	ajuns[i][j]=0;
	//ajuns[i][j]=memo(i, j-1).ajuns;
	dp[i][j]=0;
	for(k=0;k<a[i].size();k++)
	{
		if(memo(a[i][k].x, j-a[i][k].c).ajuns)
		{
			
			if(dp[i][j]<=memo(a[i][k].x, j-a[i][k].c).c) 
			{
			dp[i][j]=memo(a[i][k].x, j-a[i][k].c).c;
			ajuns[i][j]=1;
			}
		}
	}
	
	if(memo(i, j-1).ajuns) dp[i][j]=max(dp[i][j], memo(i, j-1).c);
	//ajuns[i][j]=memo(i, j-1).ajuns;
	//ajuns[i][j]=1;
	dp[i][j]+=hot[i][j];
	
	//if(hot[i][j])  printf("%d %d %d %d\n", i,j,hot[i][j], ajuns[i][j]);

	return nd(dp[i][j], ajuns[i][j]);
}

int memo2(int i, int j)
{
	printf("(%d %d)\n", i, j);
	if(j<0 || j>1500) return 0;
	if(sotie[i][j]) return dp[i][j]+hot[i][j];
	
	if(dp[i][j]) return dp[i][j];
	int k;
	dp[i][j]=memo2(i, j+1);
	for(k=0;k<a[i].size();k++)
	{
		if(j+a[i][k].c>1500) continue;
		if(sotie[a[i][k].x][j+a[i][k].c]) continue;
		dp[i][j]=max(dp[i][j], memo2(a[i][k].x, j+a[i][k].c));
	}
	dp[i][j]+=hot[i][j];
	return dp[i][j];
}


int main()
{
	citire();
freopen("amenzi.out", "w", stdout);
	for(int i=1;i<=N;i++)
		for(int j=1;j<1500;j++)
			if(sotie[i][j]){ printf("%d\n", memo(i, j).c); }
	//memo2(1, 0);
	//for(int i=1;i<=N;i++)
	//	for(int j=1;j<=1500;j++) if(sotie[i][j]) printf("%d\n", dp[i][j]);
	return 0;
}