Cod sursa(job #2653587)

Utilizator StefanSanStanescu Stefan StefanSan Data 28 septembrie 2020 16:06:39
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include      <iostream>
#include      <fstream>
#include      <algorithm>
#include      <queue>
#include      <vector>
#include      <string.h>

const int oo = (1 << 30);
const int MAX = 100005;

using namespace std;

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

int n, m, d[MAX], t;
bool inCoada[MAX];

vector < pair <int, int> > G[MAX];

struct comparaDistante {
	bool operator()(int x, int y) {
		return d[x] > d[y];
	}
};

priority_queue <int, vector < int >, comparaDistante> Coada;

void Dijkstra(int nodStart) {
	for (int i = 1; i <= n; i++)d[i] = oo;
	d[nodStart] = 0;
	Coada.push(nodStart);
	inCoada[nodStart] = true;

	while (!Coada.empty()) {
		int nodCurent = Coada.top();
		Coada.pop();
		inCoada[nodCurent] = false;

		for (unsigned int i = 0; i < G[nodCurent].size(); i++) {
			int vecin = G[nodCurent][i].first;
			int cost = G[nodCurent][i].second;
			if (d[vecin] > d[nodCurent] + cost) {
				d[vecin] = d[nodCurent] + cost;
				if (!inCoada[vecin]) {
					inCoada[vecin] = true;
					Coada.push(vecin);
				}
			}

		}
	}

}

int main() {
	ios::sync_with_stdio(false);
	in.tie(NULL), out.tie(NULL);
	
	in >> t;
	while (t--) {
		int start, D[MAX];
		in >> n >> m >> start;

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

		for (int i = 1; i <= m; i++) {
			int x, y, c;
			in >> x >> y >> c;
			G[x].push_back(make_pair(y, c));
		}
		Dijkstra(start);
		bool og = true;
		for (int i = 1; i <= n && og == true; i++) {
			if (d[i] != D[i]) og = false;
		}
		if (og == true)out << "DA" << '\n';
		else out << "NU" << '\n';
		memset(d, 0, sizeof(d));

		for (int i = 1; i <= n; i++)

			G[i].clear();
	}
			
	
	return 0;
	 
}