Cod sursa(job #3201859)

Utilizator CraiuAndreiCraiu Andrei David CraiuAndrei Data 9 februarie 2024 22:24:15
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <queue>
#define oo 2000000005
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

vector<pair<int, int>>h[50001];///lista de adiacenta cost,nod
priority_queue<pair<int, int>>q;
bool viz[50001];///Verific daca am gasit costul minim de la P la i
int dijk[50001];///Costum minim de la P la dijk[i]
int brnzn[50001];///Costul lui Bronzel
int t, n, m, p;

void Dijkstra(int P)
{
	int i, k, c;
	for (i = 1; i <= n; i++)
	{
		dijk[i] = oo;
		viz[i] = 0;
	}
	dijk[P] = 0;
	q.push(make_pair(0, P));
	while (!q.empty())
	{
		k = q.top().second;
		q.pop();
		if (viz[k] == 0)
		{
			viz[k] = 1;
			for (auto w : h[k])
			{
				i = w.second;
				c = w.first;
				if (dijk[i] > dijk[k] + c)
				{
					dijk[i] = dijk[k] + c;
					q.push(make_pair(-dijk[i], i));
				}
			}
		}
	}
}

int main()
{
	int i, k, a, b, c;
	bool ok = 1;
	fin >> t;
	for (k = 1; k <= t; k++)
	{
		ok = 1;
		fin >> n >> m >> p;
		for (i = 1; i <= n; i++)fin >> brnzn[i];
		for (i = 1; i <= m; i++)
		{
			fin >> a >> b >> c;
			h[b].push_back(make_pair(c, a));
			h[a].push_back(make_pair(c, b));
		}
		Dijkstra(p);
		/*
		for (i = 1; i <= n; i++)
			fout << dijk[i] << " ";
		fout << "\n";
		*/
		for (i = 1; i <= n; i++)
			if (dijk[i] != brnzn[i])
			{
				ok = 0;
				break;
			}
		if (ok == 0)fout << "NU\n";
		else fout << "DA\n";
	}
	return 0;
}