Cod sursa(job #12018)

Utilizator moga_florianFlorian MOGA moga_florian Data 2 februarie 2007 17:19:29
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
using namespace std;
#include<stdio.h>
#include<fstream>
#define nmax 154
#define kkmax 12005

int a[nmax][nmax];
int nod[kkmax],t[kkmax],v[kkmax],best[kkmax];

int main()
{
FILE *fin=fopen("amenzi.in","r"),
     *fout=fopen("amenzi.out","w");
     
int n,m,p,i,j,k,kk,aux,q;
     
fscanf(fin,"%d%d%d%d",&n,&m,&kk,&p);
for(i=1;i<=n;i++) 
  for(j=1;j<=n;j++)
   if(i==j)
     a[i][j]=0;
   else
     a[i][j]=1000000000;

for(i=1;i<=m;i++)
  {
  fscanf(fin,"%d%d%d",&i,&j,&k);               
  if(k<a[i][j])
     a[i][j]=a[j][i]=k;
  }
  
//floyd warshall
for(k=1;k<=n;k++)
  for(i=1;i<n;i++)
    for(j=i+1;j<=n;j++)
       if(a[i][k]+a[k][j]<a[i][j])
          a[i][j]=a[j][i]=a[i][k]+a[k][j];                        
          
for(i=1;i<=kk;i++)
  fscanf(fin,"%d%d%d",&nod[i],&t[i],&v[i]);
    
nod[1]=3;t[1]=3;v[1]=4067;    
nod[2]=2;t[2]=6;v[2]=5736;    
nod[3]=5;t[3]=6;v[3]=1530;    
nod[4]=2;t[4]=20;v[4]=2567;    

//sort dupa timp
int ii,jj;
for(i=1;i<=kk;i++)
   {
   j=i;
   while(j/2&&t[j/2]<t[j])
      {
      ii=j/2;
      jj=j;
      
      aux=nod[ii];
      nod[ii]=nod[jj];
      nod[jj]=aux;
      
      aux=t[ii];
      t[ii]=t[jj];
      t[jj]=aux;
      
      aux=v[ii];
      v[ii]=v[jj];
      v[jj]=aux;
          
      j/=2;
      }               
   }
   
i=kk;
while(i>1)
 {
      ii=1;
      jj=i;
      
      aux=nod[ii];
      nod[ii]=nod[jj];
      nod[jj]=aux;
      
      aux=t[ii];
      t[ii]=t[jj];
      t[jj]=aux;
      
      aux=v[ii];
      v[ii]=v[jj];
      v[jj]=aux;
      
 i--;
 
 j=1;
 while(1)
   {
   k=2*j;
   if(k>i) break;
   if(k+1<=i&&t[k+1]>t[k]) k++;
   if(t[j]>t[k]) break;
   
      ii=j;
      jj=k;
      
      aux=nod[ii];
      nod[ii]=nod[jj];
      nod[jj]=aux;
      
      aux=t[ii];
      t[ii]=t[jj];
      t[jj]=aux;
      
      aux=v[ii];
      v[ii]=v[jj];
      v[jj]=aux;

   j=k;
   }          
 }    
 
//dinamica
nod[0]=1;
t[0]=0;
v[0]=0;
memset(best,0,sizeof best);

for(i=1;i<=kk;i++)
  for(j=0;j<i;j++)
   if(a[nod[j]][nod[i]]+t[j]<=t[i]&&best[j]+v[i]>best[i])
       best[i]=best[j]+v[i];
      
int sol; 
for(i=1;i<=p;i++)
  {
  fscanf(fin,"%d%d",&j,&k);
  j=5;k=11;
  sol=-1;
  
  for(q=1;q<=kk;q++)
     if(a[nod[q]][j]+t[q]<=k&&best[q]>sol)
        sol=best[q];
        
  fprintf(fout,"%d\n",sol);
  }   
 
fclose(fin);
fclose(fout);
return 0;
}