Cod sursa(job #1402096)

Utilizator LycrsTrifan Tamara Lycrs Data 26 martie 2015 12:26:03
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include<cstring>

using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");

const int o=50005, inf=999999999;

typedef struct Celula{
	int nod, cost;
	Celula *next;
}*Lista;

Lista lda[o], r;
int a, b, c, S, i, j, L, k, t, n, m, D[o], H[o], C[o];

 void Add(int b, int c, Lista &y){
	Lista p=new Celula;
	p->nod=b;
	p->cost=c;
	p->next=y;
	y=p;
}

inline void Up(int k){
	if (k>1 && D[H[k]]<D[H[k/2]])
	{
		swap(H[k], H[k/2]);
		Up(k/2);
	}
}

inline void Down(int k){
	int x=k, st=k*2, dr=k*2+1;
	if (st<=L && D[H[st]]<D[H[x]]) x=st;
	if (dr<=L && D[H[dr]]<D[H[x]]) x=dr;
	
	if(k!=x){
		swap(H[k], H[x]);
		Down(x);
	}
}


int main()
{
	cin>>t;
	while (t--)
	{
		cin>>n>>m>>S;
		for(i=1; i<=n; ++i) cin>>C[i];
		
		
		for(i=1; i<=n; ++i) lda[i]=NULL;
		for(i=1; i<=m; ++i)
			cin>>a>>b>>c,
			Add(a, c, lda[b]),
			Add(b, c, lda[a]);
			
		L=1;
		for(i=1; i<=n; ++i) D[i]=inf;
		D[S]=0;
		H[1]=S;
		while (L){
			k=H[1];
			r=lda[k];
			H[1]=H[L];
			--L; Down(1);
			while (r){
				if(D[k]+r->cost < D[r->nod])
				{
					D[r->nod]=D[k]+r->cost;
					H[++L]=r->nod;
					Up(L);
				}
				r=r->next;
			}
		}
		
		bool u=1;
		for(i=1; i<=n && u; ++i)
			if (D[i]!=C[i]) u=0;
		
		
		if (u) cout<<"DA\n";
		else cout<<"NU\n";
		
	}
    
 
    return 0;
}