Cod sursa(job #389895)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 2 februarie 2010 14:27:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
# include <fstream.h>
ifstream f ("distante.in");
ofstream g ("distante.out");
int d[50005],h[50005],poz[50005],min,aux,i,n,m,s,x,z,y,ok,k,df[50005],inf=1000000,t,l,min2;

  struct nod
  {
	  int info,cost;
	  nod *urm;
  }*a[50005],*p;
  
   void sss (int i)
   {
	   if (i/2)
	   {
		   if (d[h[i/2]]>d[h[i]])
		   {
			   aux=h[i];
			   h[i]=h[i/2];
			   h[i/2]=aux;
			   poz[h[i]]=i;
			   poz[h[i/2]]=i/2;
		       sss (i/2);
		   }
	   }
   }

  void jjj (int i)
  {
	  if (2*i+1<=m)
	  {
		  if (d[h[2*i]]<d[h[2*i+1]])
		   min2=2*i;
	      else
		   min2=2*i+1;
	  }
	  else
		  if (2*i==m)
			  min2=2*i;
		  if (d[h[i]]>d[h[min]])
		  {
			  aux=h[i];
			  h[i]=h[min2];
			  h[min2]=aux;
			  poz[i]=i;
			  poz[min2]=min2;
		  }
  }
  
  
  
  void adauga (int x)
  {
	  m++;
	  h[m]=x;
	  poz[x]=m;
	  sss (m);
  }
  
  void sterg ()
  {
	h[1]=h[m];
	m--;
	poz[h[1]]=1;
	jjj (1);
  }
  
  
  int main ()
{
	f>>t;
	for (l=1;l<=t;l++)
	{
		f>>n>>m>>s;
		for (i=1;i<=n;i++)
			f>>df[i];
		for (i=1;i<=m;i++)
		{
			f>>x>>y>>z;
			if (x!=y)
			{
			p=new nod;
			p->info=y;
			p->cost=z;
			p->urm=a[x];
			a[x]=p;
			p=new nod;
			p->info=x;
			p->cost=z;
			p->urm=a[y];
			a[y]=p;
			}
		}
		d[s]=0;
		for (i=1;i<=n;i++)
			if (i!=s)
				d[i]=inf;
		
		m=1;
		h[1]=s;
		poz[s]=1;
		k=1;
		while (k<n)
		{
			min=h[1];
			p=a[h[1]];
			sterg ();
			while (p)
			{
				if (d[p->info]==inf)
				{
					d[p->info]=p->cost+d[min];
					adauga (p->info);
				}
				else
					if (d[p->info]>d[min]+p->cost)
					{
				      d[p->info]=d[min]+p->cost;
					  sss (poz[p->info]);
			        }
			p=p->urm;
			}
		k++;
		}

		ok=0;
for (i=1;i<=n;i++)
if (i!=s)
if (d[i]!=df[i])
ok=1;
if (ok==0)
	g<<"DA"<<"\n";
else
	g<<"NU"<<"\n";
	}			
			
return 0;
  }