Cod sursa(job #2445187)

Utilizator silviu982001Borsan Silviu silviu982001 Data 3 august 2019 00:40:56
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<bits/stdc++.h>

using namespace std;

bool dijkastra(const vector<pair<int, int>> v[50001], const vector<int>& dist, const int& s)
{
	priority_queue<pair<int, int>, vector<pair<int, int>>, std::greater<pair<int, int>>> H;

	int d[50001];

	memset(d, 0x3f3f3f3f, sizeof(d));

	d[s] = 0;

	for (H.push({ d[s], s }); !H.empty();)
	{
		pair<int, int> p = H.top();
		H.pop();

		if (p.first != d[p.second])
			continue;

		for (pair<int, int> pp : v[p.second])
		{
			long s = p.first + pp.second;

			if (s < d[pp.first])
			{
				d[pp.first] = s;
				H.push({ s, pp.first });
			}
		}
	}

	for (int i = 0; i < dist.size(); ++i)
		if (dist[i] != d[i])
			return false;

	return true;
}

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

	int n, m, t, s;

	fin >> t;

	for (int i = 0; i < t; ++i)
	{
		int a, b, c;
		vector<pair<int, int>> v[50001];
		vector<int> dist;
		fin >> n >> m >> s;
		--s;
		for (int i = 0; i < n; ++i)
		{
			fin >> c;
			dist.push_back(c);
		}

		for (int j = 0; j < m; ++j)
		{
			fin >> a >> b >> c;
			--a;
			--b;
			v[a].push_back({ b, c });
			v[b].push_back({ a, c });
		}

		fout << (dijkastra(v, dist, s) ? "DA\n" : "NU\n");
	}

	fin.close();
	fout.close();

	return 0;
}