Cod sursa(job #376934)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 22 decembrie 2009 22:25:48
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<stdio.h>
#define N 50001
#define M 100001
#define F 2500001
const int oo = 2000000000;
int n,m,d[N],*a[N],h[M],nh,rez[N],nod;
int *a1[N];
char s[F];
struct consturi{int x,y,z;}c[M];
bool verific()
{
	for (int i=1; i<=n; ++i)
		if (rez[i]!=d[i])
			return false;
	return true;
}
void refac()
{
	for (int i=1; i<=n; ++i)
	{
		delete a[i];
		delete a1[i];
		d[i]=0;
	}
}
inline void schimb(int &x,int &y)
{
	int aux=x;
	x=y;
	y=aux;
}

void coboara(int p)
{
	int pmin=p;
	if(2*p<=nh && d[h[2*p]] < d[h[pmin]])
		pmin=2*p;
	if(2*p+1<=nh && d[h[2*p+1]] < d[h[pmin]])
		pmin=2*p+1;
	if(pmin!=p)
	{
		schimb(h[p],h[pmin]);
		coboara(pmin);
	}
}

void urca(int p)
{
	while(p>=2 && d[h[p/2]] > d[h[p]])
	{
		schimb(h[p],h[p/2]);
		p/=2;
	}
}
int minim()
{
	int aux=h[1];
	schimb(h[1],h[nh--]);
	coboara(1);
	return aux;
}
void update(int x)
{
	for (int i=1; i<=a[x][0]; ++i)
	{
		int y=a[x][i],c=a1[x][i];
		if (d[x]+c<d[y])
		{
			d[y]=d[x]+c;
			h[++nh]=y;
			urca(nh);
		}
	}
}
void dijkstra(int x0)
{
	for (int i=1; i<=n; ++i)
		d[i]=oo;
	d[x0]=0;
	h[++nh]=x0;
	while(nh)
	{
		int x=minim();
		update(x);
	}
}                   
void citire()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	short int t;
	scanf("%hd",&t);
	while (t--)
	{
		scanf("%d%d%d\n",&n,&m,&nod);
		for (int i=1; i<=n; ++i)
			scanf("%d",&rez[i]);
	      	for (int i=1; i<=m; ++i)
		{
		      	scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].z);
			h[i]=i;
			++d[c[i].x];
			++d[c[i].y];
		}
	for (int i=1; i<=n; ++i)
	{
		a[i]=new int [1+d[i]];
		a[i][0]=0;
		a1[i]=new int [1+d[i]];
		a1[i][0]=0;
	}
	for (int i=1; i<=m; ++i)
	{
		a[c[i].x][++a[c[i].x][0]]=c[i].y;
		a1[c[i].x][++a1[c[i].x][0]]=c[i].z;
	}
	dijkstra(nod);
	if (verific())
		printf("DA\n");
	else
		printf("NU\n");
	refac();
	}
}

int main()
{
	citire();
	return 0;
}