Cod sursa(job #271101)

Utilizator c_e_manuEmanuel Cinca c_e_manu Data 4 martie 2009 21:44:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream.h>
#define N 50001
#define INF 4000000000
#define LL long long

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

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

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

void insert(LL where, LL what, LL 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;
	LL p,u,X;
	memset(d,INF,N);
	memset(viz,0,N);
	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]=d[X]+q->cost;
				if(!viz[q->info])
				{	qu[++u]=q->info;
					viz[q->info]=1;
				}
			}
		p++;
	}
}

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

int main()
{       LL 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;
}