Cod sursa(job #11179)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 30 ianuarie 2007 20:28:30
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define sz size()
#define nmax 128
#define tmax 4096
#define inf 1000111000

int n,m,k,p;
vector < pair <int,int> > G[nmax];
int A[tmax][nmax],S[tmax][nmax];
int TT=0;

int main()
{
	FILE *fi=fopen("amenzi.in","r"),*fo=fopen("amenzi.out","w");
	fscanf(fi,"%d %d %d %d",&n,&m,&k,&p);
	int i,j,a,b,c;
	FOR(i,0,m)
	{
		fscanf(fi,"%d %d %d",&a,&b,&c);
		if(a>100||b>100)
			printf("AAA\n");
		a--,b--;
		G[a].pb(mp(b,c));
		G[b].pb(mp(a,c));
	}

	FOR(i,0,k)
	{
		fscanf(fi,"%d %d %d",&a,&b,&c);
		if(a>100)
			printf("BBB\n");
		a--;
		S[b][a]+=c;
		TT>?=b;
	}
	
	FOR(i,0,tmax) FOR(j,0,n)
	{
		A[i][j]=0+(!i&&!j);
		if(i)
			A[i][j]=A[i-1][j];
		FOR(a,0,G[j].sz)
			if(i>=G[j][a].s&&A[i-G[j][a].s][G[j][a].f])
			{

				A[i][j]>?=A[i-G[j][a].s][G[j][a].f];
			}
		if(A[i][j])
			A[i][j]+=S[i][j];
	}

	FOR(i,0,p)
	{
		fscanf(fi,"%d %d",&a,&b);
		if(a>100)
			printf("CCC\n");
		TT>?=b;
		a--;
		fprintf(fo,"%d\n",A[b][a]-1);
	}
	fclose(fi);
	fclose(fo);
	fprintf(stderr,"P=%d\n",p);
	fprintf(stderr,"K=%d\n",k);
	fprintf(stderr,"TT=%d\n",TT);
	return 0;
}