Cod sursa(job #11466)

Utilizator alinaddoca alina alinad Data 31 ianuarie 2007 18:58:38
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include<stdio.h>


int n, m, k, p;
int q, u, Q, U;
int x[151][151], nr[151];
int CO[1000][4];

FILE *g=fopen("amenzi.out", "w"), *f=fopen("amenzi.in", "r");



void inserare(int a, int t, int co[1000][3])
{
 int poz, l;
 u++;
 poz=u-1;
 while(poz>q && t<co[poz][2])
  {
   l=poz+1;
   co[l][1]=co[poz][1];
   co[l][2]=co[poz][2];
   poz--;
  }
 poz++;
 co[poz][1]=a;
 co[poz][2]=t;
}


int verif(int a, int b, int c)
{
 int co[1000][3];
 int ok=1, t, sel[151], i;

 q=u=1;
 co[q][1]=a;
 co[q][2]=0;

 for(i=1; i<=n; i++)
   sel[i]=0;

 while(ok && q<=u)
  {
   int i;
   int newa, newt;

   a=co[q][1];
   t=co[q][2];

   for(i=1; i<=n && ok; i++)
    if(x[i][a]!=-1 && sel[i]==0)
     {
      newa=i;
      newt=t+x[i][a];

      if(sel[i]==0)
       {
	sel[i]=1;
	inserare(newa, newt, co);
       }

      if(newa==b)
       {
	ok=0;
	if(newt<=c)
	  return 1;
	else
	  return 0;
       }
     }
    q++;
   }
 return 0;
}



void insert(int a, int b, int c)
{
 int  poz, l;
 U++;
 poz=U-1;

 while(poz>Q && b>CO[poz][2])
  {
   l=poz+1;
   CO[l][1]=CO[poz][1];
   CO[l][2]=CO[poz][2];
   CO[l][3]=CO[poz][3];

   poz--;
  }
 poz++;
 CO[poz][1]=a;
 CO[poz][2]=b;
 CO[poz][3]=c;
}


void calcul_amenda(int X, int y, int timp[151][151], int amenda[151][151])
{
 int nod, am, T, i, amen, tim;
 int ok;
 CO[1][1]=1;
 CO[1][2]=0;
 CO[1][3]=0;
 Q=U=1;
 ok=1;
 while(ok && Q<=U)
  {
   nod=CO[Q][1];
   am=CO[Q][2];
   T=CO[Q][3];

   for(i=1; i<=n; i++)
    {
     if(x[nod][i]!=-1)
      {
       if(amenda[i][nr[i]]!=0)
	{
	 nr[i]=1;
	 while(timp[i][nr[i]])
	  {
	   if(T+x[nod][i]<=timp[i][nr[i]])
	    {
	     tim=timp[i][nr[i]];
	     amen=am+amenda[i][nr[i]];
	     if(verif(i, X, y-tim))
	      {
	       insert(i, amen, tim);
	       ok=1;
	      }
	     else
		ok=0;
	    }
	   else
	     ok=0;
	   nr[i]++;
	  }
	}
      }
    }
   Q++;
  }

 if(ok==0)
   fprintf(g, "%d\n", CO[Q-1][2]);
 else
   fprintf(g, "-1\n");
}



void citire()
{
 int i, j, a, b, c;
 int timp[151][151], amenda[151][151];
 fscanf(f, "%d", &n);
 fscanf(f, "%d%d%d", &m, &k, &p);

 for(i=1; i<=m; i++)
  for(j=1; j<=m; j++)
    x[i][j]=x[j][i]=-1;

 for(i=1; i<=m; i++)
  {
   fscanf(f, "%d%d%d", &a, &b, &c);
   x[a][b]=x[b][a]=c;
  }

 for(i=1; i<=n; i++)
   nr[i]=1;

 for(i=1; i<=k; i++)
  {
   fscanf(f, "%d%d%d", &a, &b, &c);
   timp[a][nr[a]]=b;
   amenda[a][nr[a]]=c;
   nr[a]++;
  }

 for(i=1; i<=n; i++)
   nr[i]=1;

 for(i=1; i<=p; i++)
  {
   fscanf(f, "%d%d", &a, &b);
   calcul_amenda(a, b, timp, amenda);
   for(j=1; j<=n; j++)
     nr[j]=1;
   for(j=1; j<=k; j++)
    {
     CO[j][1]=0;
     CO[j][2]=0;
     CO[j][3]=0;
    }
  }
}


int main()
{
 citire();
 fclose(f);
 fclose(g);

 return 0;


}