Cod sursa(job #721125)

Utilizator mottyMatei-Dan Epure motty Data 23 martie 2012 12:25:09
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <set>

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

const int T = 11;
const int N = 50005;

int n, m, S;
int dCheck[N];
int curD[N];

vector < pair<int,int> > g[T][N];
set < pair<int,int> > s[T];

void readCase(int test)
{
	in >> n >> m >> S;

	for (int i = 1; i <= n; ++i)
		in >> dCheck[i];

	while (m--) {
		int a, b, c;
		in >> a >> b >> c;

		g[test][a].push_back(make_pair(b, c));
		g[test][b].push_back(make_pair(a, c));
	}
}

void check(int node, int cost, int t)
{
	for (int i = 0; i < (int)g[t][node].size(); ++i) {
		int next = g[t][node][i].first;
		if (curD[next] == 0 || curD[next] > cost + g[t][node][i].second) {
			curD[next] = cost + g[t][node][i].second;
			s[t].insert(make_pair(curD[next], next));
		}
	}
}

string solveCase(int t) {
	s[t].insert(make_pair(0,S));
	memset(curD, 0, sizeof(curD));

	while(!s[t].empty()) {
		pair<int,int> bighin = *s[t].begin();
		int node = bighin.second;
		int cost = bighin.first;

		if (cost != dCheck[node] && node != S)
			return "NU";

		s[t].erase(s[t].begin());
		check(node, cost, t);
	}

	return "DA";
}

int main()
{
	int t;
	in >> t;

	while (t--) {
		readCase(t);
		out << solveCase(t) << "\n";
	}

	return 0;
}