Cod sursa(job #563570)

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

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

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;

void solve()
	{
		int 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(d[G[x][i]] > d[x] + C[x][i])
					d[G[x][i]] = val + C[x][i], T.insert(mp( d[ G[x][i]], G[x][i]));
			}
		}
}

bool ok()
	{
		for(int i = 1 ; i <= N ; ++i)
			if(d[i] != dc[i])return false;
		return true;
}

int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		scanf("%d", &K);
		while(K--)
		{
			scanf("%d%d%d", &N, &M, &S);
			for(int i = 1 ; i <= N; ++i)
				scanf("%d", &dc[i]), d[i] = inf;
			d[1] = 0;
			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);
			solve();
			if(ok())printf("DA\n");
			else printf("NU\n");
			for(int i = 1 ; i <= N ; ++i)
				G[i].clear(), C[i].clear();
		}
		return 0;
}