Cod sursa(job #433482)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 3 aprilie 2010 18:54:20
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

#define pb push_back
#define mp make_pair
#define ls(st) st<<1
#define father(st) st>>1
#define F first
#define S second


#define INF 0x3f3f3f3f
#define N 50100


int t, n, m, s, k, ok, 
	d[N], h[N], poz[N], d2[N];
	
vector < pair<int, int> > a[N];


void downheap(int w){
int son; 
	while (ls(w) <= k){
		son = ls(w);
		if (son+1 <= k)
			if (d[h[son]] > d[h[son+1]])
				++son;
		
		if (d[h[son]] < d[h[w]]){
			swap(poz[h[son]], poz[h[w]]);
			swap(h[son], h[w]);
			w = son;
		}
		else
			return;
	}
}

void upheap(int w){
	while (w>1 && d[h[w]] < d[h[father(w)]]){
		swap(poz[h[w]], poz[h[father(w)]]);
		swap(h[w], h[father(w)]);
		w = father(w);
	}
}



void dijkstra(){
int min, i, nod2, cost2;
	while (k){
		min = h[1];
		swap(h[1], h[k]);
		k--;
		downheap(1);
	
		for (i = 0; i < a[min].size(); ++i){
			nod2 = a[min][i].F; cost2 = a[min][i].S;
			if (d[min] + cost2 < d[nod2]){
				d[nod2] = d[min] + cost2;
				if (poz[nod2] == -1){
					poz[nod2] = ++k;
					h[k] = nod2;
					upheap(k);				
				}
				else
					upheap(k);
			}
		}
	}
}

void citire();

int main(){
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	
	citire();
	
	return 0;
}

void citire(){

	scanf("%d", &t);
	
int i, x, y, z;
	for ( ; t; --t){
		scanf("%d %d %d", &n, &m, &s);
		for (i = 1; i <= n; i++)
			d[i] = INF, poz[i] = -1;
		d[s] = 0; poz[s] = 1; h[1] = s; k = 1;
		
		for (i = 1; i <= n; i++){
			scanf("%d", &d2[i]);
			a[i].clear();
		}
		for (i = 1; i <= m; i++){
			scanf("%d %d %d", &x, &y, &z);
			a[x].pb(mp(y,z));
			a[y].pb(mp(x,z));
		}
		
		dijkstra();
		ok = 1;
		for (i = 1; i <= n; i++)
			if (d[i] != d2[i]){
				ok = 0; break;
			}
		if (ok) printf("DA\n");
		else	printf("NU\n");
	}


}