Cod sursa(job #3203036)

Utilizator laurentiu.maticaMatica Laurentiu-Andrei laurentiu.matica Data 12 februarie 2024 23:44:11
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
// #include <iostream>

#include <fstream>
#include <queue>

using namespace std;

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

const int NMAX = 50001;
const int INF = 1000000001;

auto cmp = [](pair<int, int>a, pair<int, int>b) {return a.first > b.first; };
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)>q(cmp);
vector<pair<int,int>>g[NMAX];
int viz[NMAX];
int drum[NMAX];
int drumFin[NMAX];

void dijkstra(int st)
{
	drum[st] = 0;
	q.push({ 0,st });
	while (!q.empty())
	{
		pair<int, int>p=q.top();
		q.pop();
		if (viz[p.second])
			continue;
		viz[p.second] = 1;
		for(auto x:g[p.second])
			if (!viz[x.second] && drum[x.second] > drum[p.second] + x.first)
			{
				drum[x.second] = drum[p.second] + x.first;
				q.push({ drum[x.second],x.second });
			}
	}
}
int main()
{
	int t;
	cin >> t;
	for (int it = 0; it < t; it++)
	{
		int n, m, s;
		bool ok = true;
		cin >> n >> m >> s;
		for (int i = 1; i <= n; i++)
			cin >> drumFin[i];
		for (int i = 0; i < m; i++)
		{
			int x, y, c;
			cin >> x >> y >> c;
			g[x].push_back({ c,y });
		}
		for (int i = 1; i <= n; i++)
			drum[i] = INF;
		dijkstra(s);
		for (int i = 2; i <= n; i++)
		{
			if (i > 1 && drum[i] == INF)
				drum[i] = 0;
			if (drum[i] != drumFin[i])
			{
				ok = false;
				cout << "NU" << '\n';
				break;
			}
		}
		if (ok)
			cout << "DA" << '\n';
	}
	return 0;
}