Cod sursa(job #82500)

Utilizator gigi_becaliGigi Becali gigi_becali Data 7 septembrie 2007 12:11:22
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <string>
#include <queue>
#include <list>
#define oo 0x3f3f3f3f
#define maxn 50001
#define pb push_back

struct nod { int n, c;nod(){}; nod(int a, int b){n=a; c=b;};};

nod *a[maxn];
//vector<nod>a[maxn];//vector<vector<nod> >a;
int d[maxn];

struct cmp{
	bool operator()(const int &a, const int &b)const
	{
		if(d[a]>d[b]) return 1;
		return 0;
	}
};

int n, m, d1[maxn],source;

void dijkstra()
{
	priority_queue<int, vector<int>,cmp>Q;
	memset(d, oo, sizeof(d));
	d[source]=0;
	Q.push(source);
	int it;
	nod i;
	int u;
	while(!Q.empty())
	{	
	
		u=Q.top();
		Q.pop();

		for(it=1;it<=a[u][0].n;++it)//,last=a[u][0].n; i<=last; ++i, ++it)
		{
		  i=a[u][it];
		  if(d[u]+i.c<d[i.n])
		    d[i.n]=d[u]+i.c,
		      Q.push(i.n);
		}
	}

}

int main()
{
	int T,p, q, c,i;
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%d\n", &T);
	while(T--)
	{
		scanf("%d %d %d\n",&n, &m, &source);
		for(i=1;i<maxn;++i) free(a[i]);
		for(i=1;i<=n;++i) a[i]=new nod [2], a[i][0].n=0;
		//a.clear();
		//a.resize(n+1);
		
		for(i=1;i<=n;++i) scanf("%d ", d1+i);
		
		while(m--)
		{
			scanf("%d %d %d\n", &p, &q, &c);
			
			a[p]=(nod*)realloc(a[p], (a[p][0].n+2)*sizeof(nod));
			a[q]=(nod*)realloc(a[q], (a[q][0].n+2)*sizeof(nod));
			a[p][++a[p][0].n]=nod(q, c);
			a[q][++a[q][0].n]=nod(p, c);
			//a[p].pb(nod(q, c));
			//		a[q].pb(nod(p, c));
		}
		/*
		for(i=1;i<=n;++i)
		  {
		    for(int j=1;j<=a[i][0].n;++j)printf("%d ", a[i][j].n);
		    printf("\n");
		  }
		*/
		dijkstra();
		int ok=1;
		for(i=1;i<=n;++i)
			if(d[i]!=d1[i]) { ok=0; break;}
		if(ok)printf("DA\n");
		else printf("NU\n");
	}

return 0;
}