Cod sursa(job #426111)

Utilizator mihaionlyMihai Jiplea mihaionly Data 26 martie 2010 14:07:30
Problema Amenzi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
using namespace std;
#define nmax 153
#define tmax 3505
#define inf 1<<20
int n,m,p,k;
FILE *f=fopen("amenzi.in","r");
FILE *g=fopen("amenzi.out","w");
int G[nmax][nmax],C[nmax][nmax];
int Am[nmax][nmax];
int din[tmax][nmax];
int gr[nmax];
inline int max(int x,int y)
 {
 if(x>y) return x;
 return y;
 }
void read()
 {
 int x,y,i,c;
 fscanf(f,"%d %d %d %d",&n,&m,&k,&p);
 for(i=1;i<=m;i++)
  {
  fscanf(f,"%d %d %d",&x,&y,&c);
  G[x][gr[x]]=y;
  C[x][gr[x]]=c;
  G[y][gr[y]]=x;
  C[y][gr[y]]=c;
  ++gr[x];
  ++gr[y];
  }
 for(i=1;i<=k;i++)
  {
  fscanf(f,"%d %d %d",&x,&y,&c);
  Am[y][x]+=c; //la timpul y din intersectia x,amenda creste cu c
  }
 }
void dinamic()
 {
 int t,i,j,nod;
 for(i=1;i<=n;i++) din[0][i]=-1;
 din[0][1]=0;
 for(t=1;t<=tmax-5;t++)
  {
  for(i=1;i<=n;i++)
   {
   din[t][i]=din[t-1][i];
   for(j=0;j<gr[i];j++)
    {
    nod=G[i][j];
	if(t-C[i][j]<0||din[t-C[i][j]][nod]==-1) 
	 continue;
	din[t][i]=max(din[t][i],din[t-C[i][j]][nod]);
    }
   if(Am[t][i]&&din[t][i]!=-1)
    din[t][i]+=Am[t][i];
   }
  }
 }
int main()
 {
 int x,y;
 read();
 dinamic();
 for(int i=1;i<=p;i++)
  {
  fscanf(f,"%d %d",&x,&y);
  fprintf(g,"%d\n",din[y][x]);
  }
 return 0;
 }