Cod sursa(job #558996)

Utilizator selea_teodoraSelea Teodora selea_teodora Data 17 martie 2011 15:46:30
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<fstream>
using namespace std;
int t,a,b,c,n,m,i,j,sursa,D[50005],d[50005],poz[50005],minim,k,sw,h[50005];
const int inf=1<<30;
typedef
struct nod
{
	int nr, cost;
	nod*urm;
}*Pnod;
Pnod l[50005];
void jos()
{
	int caut=1,fiu,aux;;
	do{
		fiu=0;
		if(caut*2<=k)
		{
			fiu=caut*2;
			if((caut*2+1)<=k&&d[h[caut*2]]>d[h[(caut*2)+1]])
				fiu=(caut*2)+1;
			if(d[h[fiu]]>=d[h[caut]])
				fiu=0;
		}
		if(fiu!=0)
		{
			aux=h[caut];
			h[caut]=h[fiu];
			h[fiu]=aux;
			poz[h[caut]]=caut;
			poz[h[fiu]]=fiu;
			caut=fiu;
		}
	}while(fiu!=0);
}
void sus(int caut)
{
	int aux;
	while((caut>1)&&(d[h[caut]]<d[h[caut/2]]))
	{
		poz[h[caut]]=caut/2;;
		poz[h[caut/2]]=caut;;
		aux=h[caut];
		h[caut]=h[caut/2];
		h[caut/2]=aux;
		caut=caut/2;
	}
}
void sterg()
{
	h[1]=h[k];
	poz[h[k]]=1;
	k--;
	if(k!=0)
		jos();
}
	
void dijstra()
{
	for(i=1;i<=n;i++)
	{
		d[i]=inf;
		poz[i]=0;
	}
	poz[sursa]=1;
	Pnod p;
	d[sursa]=0;
	k++;
	h[k]=sursa;
	minim=sursa;
	while(k!=0)
	{
		minim=h[1];
		sterg();
		for(p=l[minim];p!=NULL;p=p->urm)
			if(d[p->nr]>d[minim]+p->cost)
			{
				d[p->nr]=d[minim]+p->cost;
				if(poz[p->nr]==0)
				{
					k++;
					h[k]=p->nr;
					poz[p->nr]=k;
				}
				else
					sus(poz[p->nr]);
			}
	}
}
int main()
{
	ifstream fin("distante.in");
	ofstream fout("distante.out");
	fin>>t;
	Pnod p;
	int r;
	for(r=1;r<=t;r++)
	{
		
		fin>>n>>m>>sursa;
		sw=0;
		for(j=1;j<=n;j++)
			{
				l[j]=NULL;
				fin>>D[j];
		}
		for(j=1;j<=m;j++)
		{
			
		   fin>>a>>b>>c;
		   p=new(nod);
		   p->nr=a;
		   p->cost=c;
		   p->urm=l[b];
		   l[b]=p;
		   p=new(nod);
		   p->nr=b;
		   p->cost=c;
		   p->urm=l[a];
		   l[a]=p;
		}
		dijstra();
		for(j=1;j<=n;j++)
		if(d[j]!=D[j])
			sw++;
		if(sw==0)
			fout<<"DA"<<'\n';
		else fout<<"NU"<<'\n';
	}
  fin.close();
  fout.close();
  return 0;
}