Cod sursa(job #2606411)

Utilizator r00t_Roman Remus r00t_ Data 27 aprilie 2020 17:59:38
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <tuple>

using namespace std;

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

int md[100005], dst[100005];
bool viz[100005];
int t, n, m, s;

vector<tuple<int, int> >vp[100005];

void dijkstra(int x)
{
	for (int i = 1; i <= n; i++) {
		dst[i] = 0x3f3f3f3f;
		viz[i] = 0;
	}
	dst[x] = 0;
	priority_queue<tuple<int, int>>pq;//qw,a
	pq.push({ 0,x });

	while (!pq.empty())
	{
		int a = get<1>(pq.top());
		pq.pop();
		if (viz[a])
			continue;
		for (auto& it : vp[a])
		{
			int b, w;
			tie(b, w) = it;
			if (dst[a] + w < dst[b]) {
				dst[b] = dst[a] + w;
				pq.push({ -dst[b], b });
			}
		}
		viz[a] = 1;


	}




}


int main()
{
	ios::sync_with_stdio(false);

	fin >> t;

	for (int k = 0; k < t; k++)
	{
		fin >> n >> m >> s;
		for (int i = 1; i <= n; i++)
		{
			fin >> md[i];
		}
		int a, b, w;
		for (int i = 0; i < m; i++)
		{
			fin >> a >> b >> w;
			vp[a].push_back({ b,w });
			vp[b].push_back({ a,w });
		}
		dijkstra(s);

		bool out = 1;

		for (int i = 1; i <= n; i++)
		{
			//cout << dst[i] << ' ';
			if (dst[i] != md[i]) {
				out = 0;
			}
		}
		//cout << '\n';
		if (out == 1)
			fout << "DA\n";
		else
			fout << "NU\n";
		for (int i = 1; i <= n; i++)
			vp[i].clear();
	}

}