Cod sursa(job #281726)

Utilizator alisssiaMititelu Andra alisssia Data 15 martie 2009 18:45:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
using namespace std;
#include<cstdio>
#include<string>
#define Nmax 50000
#define Mmax 100000
#define inf 0x3f3f3f3f
int h[Nmax],d[Nmax],poz[Nmax],d2[Nmax],n,m,s,k,min1,T,sol[11];
struct nod { int v,cost; nod *next;};
nod *a[Nmax];

void add(int i,int j,int c)
{
	nod*p=new nod;
	p->v=i;
	p->next=a[j];
	p->cost=c;
	a[j]=p;
	p=new nod;
	p->v=j;
	p->next=a[i];
	p->cost=c;
	a[i]=p;
}

void sc(int i ,int j)
{
	int aux=h[i];
	h[i]=h[j];
	h[j]=aux;
	poz[h[i]]=i;
	poz[h[j]]=j;
}

void upheap(int i)
{
	int tata=i/2;
	while(tata && d[h[tata]]>d[h[i]])
		{
			sc(tata,i);
			i=tata;
			tata=tata/2;
	}
}

void downheap(int i)
{
	int fiu=2*i;
	while(fiu<=k)
	{
		if(fiu<k &&d[h[fiu]]>d[h[fiu+1]]) fiu++;
		if(d[h[fiu]]<d[h[i]])
	{
		sc(fiu,i);
		i=fiu;
		fiu=fiu*2;
	}
		else fiu=k+1;
	}
}
	
void dij(int n,int s)
{
	for(int i=1;i<=n;i++)
	{
		d[i]=inf;
		poz[i]=-1;
	}
	k=0;
	h[++k]=s;
	poz[h[k]]=1;
	d[s]=0;
	while(k)
	{
		min1=h[1];
		sc(1,k);
		k--;
		downheap(1);
		
		for(nod *u=a[min1];u;u=u->next)
			if(d[u->v]>d[min1]+u->cost)
				{
					d[u->v]=d[min1]+u->cost;
					if(poz[u->v]!=-1) upheap(poz[u->v]);
					else {
						h[++k]=u->v;
						poz[u->v]=k;
						upheap(k);
					}
			}
	}
}

int main()
{
	int i,x,y,z,t;
	freopen("distante.in","r",stdin);
	scanf("%d",&T);
	for(int t=1;t<=T;t++)
	{
		memset(a,NULL,sizeof(nod));
		scanf("%d%d%d",&n,&m,&s);
		for(i=1;i<=n;i++)
			scanf("%d",&d2[i]);
		for(i=1;i<=m;i++)
			{
				scanf("%d%d%d",&x,&y,&z);
				add(x,y,z);
		}
		dij(n,s);
		x=0;
		for(i=1;i<=n && x==0;i++)
			if(d[i]!=d2[i]) x=1;
		if(x==0)sol[t]=1; 
			
	}
	freopen("distante.out","w",stdout);
	for(t=1;t<=T;t++)
		if(sol[t]) printf("DA\n");
	else printf("NU\n");
	return 0;
}