Cod sursa(job #563558)

Utilizator pykhNeagoe Alexandru pykh Data 25 martie 2011 13:58:27
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<cstdio>
#include<set>
#include<vector>
#include<cstring>
using namespace std;

const char in[]="distante.in";
const char out[]="distante.out";

int n, m ;

const int inf = 1<<30;
const int MaxN = 50100;
#define mp make_pair
#define pb push_back

int K, N, M, S;
int d[MaxN], dc[MaxN];

vector<int> G[MaxN], C[MaxN];
set< pair<int,int> >T;

int solve()
	{
		int nr = 0, i;
		T.insert(mp(0, S));
		while(T.size())
		{
			int val = (*T.begin()).first, x = (*T.begin()).second;
			T.erase(*T.begin());
			for(i = 0 ; i < G[x].size() ; ++i)
				{
				if(dc[G[x][i]] == val + C[x][i] && !d[G[x][i]] )++nr, d[G[x][i]] = 1, T.insert(mp(dc[G[x][i]], G[x][i]));
				else if(dc[G[x][i]] < val + C[x][i])T.insert(mp(dc[G[x][i]], G[x][i]));
				else if(dc[G[x][i]] > val + C[x][i]) return 0;
				if(nr == N - 1) return 1;
			}
		}
		return 0;
}

int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		scanf("%d", &K);
		while(K--)
		{
			scanf("%d%d%d", &N, &M, &S);
			memset(G, 0, MaxN);
			memset(C, 0, MaxN);
			for(int i = 1 ; i <= N; ++i)
				scanf("%d", &dc[i]);
			int a, b, c;
			for(int i = 1 ; i <= M ; ++i)
				scanf("%d%d%d", &a, &b, &c), G[a].pb(b), C[a].pb(c), G[b].pb(a), C[b].pb(c);
			int ok = solve();
			if(ok)printf("DA\n");
			else printf("NU\n");
		}
		return 0;
}