Cod sursa(job #290075)

Utilizator c_e_manuEmanuel Cinca c_e_manu Data 27 martie 2009 13:04:40
Problema Distante Scor 100
Compilator cpp Status done
Runda aa Marime 1.32 kb
#include<fstream.h>
#define N 50005

ifstream fin("distante.in");
ofstream fout("distante.out");

struct nod{
	int info,cost;
	nod *next;
	};
nod *prim[N],*aux;

int t,n,m,s,qu[N],viz[N];
long long d[N], sol[N];

void insert(int where, int what, int how_much)
{       nod *p;
	p=new nod;
	p->info=what;
	p->cost=how_much;
	p->next=prim[where];
	prim[where]=p;
}

void bellmanFord()
{       nod *q;
	int p,u,X,i;
	//memset(d,0,N);
	//memset(viz,0,N);
	for(i=1;i<=N;i++) d[i]=viz[i]=0;
	p=u=1;
	viz[s]=1;
	d[s]=0;
	qu[p]=s;
	while(p<=u)
	{       X=qu[p];viz[X]=0;
		for(q=prim[X];q;q=q->next)
			if(d[q->info]>d[X]+q->cost||(!d[q->info]&&q->info!=s))
			{	d[q->info]=d[X]+q->cost;
				if(!viz[q->info])
				{	qu[++u]=q->info;
					viz[q->info]=1;
				}
			}
		p++;
	}
}

int check()
{       int i;
	for(i=1;i<=n;i++)
		if(d[i]!=sol[i]) return 0;
	return 1;
}

int main()
{       int i,x,y,ct;
	fin>>t;
	while(t)
	{       fin>>n>>m>>s;
		for(i=1;i<=n;i++)
			fin>>sol[i];
		for(i=1;i<=m;i++)
		{	fin>>x>>y>>ct;
			insert(x,y,ct);
			insert(y,x,ct);
		}
		bellmanFord();
		if(check())	fout<<"DA\n";
		else 		fout<<"NU\n";
		for(i=1;i<=n;i++)
		{	while(prim[i])
			{	aux=prim[i];
				prim[i]=prim[i]->next;
				delete aux;
			}
			prim[i]=NULL;
		}
		t--;
	}
	return 0;
}