Cod sursa(job #281729)

Utilizator blasterzMircea Dima blasterz Data 15 martie 2009 18:53:23
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
using namespace std;
#include<cstdio>
#include<string>
#define Nmax 50000
#define Mmax 100000
#define inf 0x3f3f3f3f
#define L (i>>1)
#define R (L|1)


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 up(int i)
{
    if(i <= 1) return;
    if(d[h[i]] < d[h[i/2]]) sc(i, i/2), up(i/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 down(int i)
{
    int m=i;

    if(L <= k)
	if(d[h[L]] < d[h[m]]) m=L;
    if(R <= k)
	if(d[h[R]] < d[h[m]]) m=R;
    
    if(i != m) sc(i, m), down(m);
}

void dij(int n,int s)
{
	for(int i=0;i<=n;i++)
	{
		d[i]=inf;
		poz[i]=-1;
		h[i]=0;
	}
	k=0;
	h[++k]=s;
	poz[h[k]]=1;
	d[s]=0;
	while(k)
	{
		min1=h[1];
		sc(1,k);
		k--;
		down(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) up(poz[u->v]);
					else {
						h[++k]=u->v;
						poz[u->v]=k;
						up(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;
}