Cod sursa(job #2829840)

Utilizator tandiToader Andi tandi Data 9 ianuarie 2022 00:37:34
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

vector<pair<int, int>> adiacenta[50005];
vector<int> bronz, distante;

void dijkstra(int s, int n)
{
	priority_queue<pair<int, int>> pq;
	pq.push(make_pair(0, s));
	distante.resize(n + 1, 10000);
	while (pq.empty() == false)
	{
		int sursa = pq.top().second;
		//cout << sursa;
		pq.pop();
		for (int k = 0; k < adiacenta[sursa].size(); k++)
		{
			pair<int, int> j = adiacenta[sursa][k];
			int destinatie = adiacenta[sursa][k].first;
			int cost = adiacenta[sursa][k].second;
			//cout << destinatie << " " << cost << endl;
			if (distante[sursa]+cost < distante[destinatie])
			{
				distante[destinatie] = distante[sursa] + cost;
				//cout << distante[destinatie] << endl;
				pq.push(make_pair( -distante[destinatie],  destinatie));
			}
		}
	}
}

int main()
{
	ifstream in("distante.in"); //citesc datele din fisier
	ofstream out("distante.out");
	int nr_teste;
	in >> nr_teste;
	while (nr_teste > 0)
	{
		int n, m, s;
		in >> n >> m >> s;
		bronz.resize(n + 1, 0);
		for (int i = 1; i <= n; i++) //rezultatul lui Bronzarel
			in >> bronz[i];
		for (int i = 1; i <= m; i++) //eliberez lista de adiacenta si o citesc
			adiacenta[i].clear();
		for (int i = 1; i <= m; i++)
		{
			int tata, fiu, cost;
			in >> tata >> fiu >> cost;
			adiacenta[tata].push_back(make_pair(fiu, cost));
			adiacenta[fiu].push_back(make_pair(tata, cost));
		}

		dijkstra(s, n);

		int ok = 1;
		for (int i = 1; i <= n; i++) 
			if (bronz[i] != distante[i])
			{
				ok--;
				out << "NU" << endl;
				break;
			}
		if (ok) out << "DA" << endl;

		nr_teste--;
	}
	in.close();
	out.close();
}