Pagini recente » Cod sursa (job #2103286) | Cod sursa (job #1340414) | Cod sursa (job #2669846) | Cod sursa (job #630540) | Cod sursa (job #2829947)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
vector< pair<int, int> > adiacenta[50005]; //matrice de adiacenta
int bronz[50005], distante[50005]; //lista cu distantele calculate de Bronzarel, lista cu distantele minime reale
void dijkstra(int s, int n)
{
priority_queue<pair<int, int>> pq; //simulez cu ajutorul unei cozi de prioritati un max heap (toate elementele se vor afla in ordine crescatoare)
pq.push(make_pair(0, s)); //din capul careia voi lua mereu perechea care are costul cel mai mic
distante[s] = 0; //costul din nodul sursa spre el va fi egal cu 0
while (pq.empty() == false)
{
int sursa = pq.top().second;
//cout << sursa;
pq.pop();
for (vector< pair<int, int> >::iterator k = adiacenta[sursa].begin(); k != adiacenta[sursa].end(); k++) //iau vecinii nodului curent si verific daca nu exista o calea mai scurta din s catre ei prin intermediul sau
{ //daca exista, actualizez lista cu distante
int destinatie = k->first;
int cost = k->second;
//cout << destinatie << " " << cost << endl;
if (distante[sursa] + cost < distante[destinatie]) //daca se reduce costul prin nodul curent, actualizez distanta cu noul cost calculat
{
distante[destinatie] = distante[sursa] + cost;
//cout << distante[destinatie] << endl;
pq.push(make_pair(-distante[destinatie], destinatie)); // introduc cu minus prioritate pentru a situa elementele in capatul cozii
}
}
}
}
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;
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 <= n; i++) ////actualizez lista cu distante cu valori infinite
distante[i] = 100000;
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++) //verific daca raspunsurile lui Bronzanel sunt la fel cu cele calculate de mine:)
if (bronz[i] != distante[i])
{
ok--;
out << "NU" << endl;
break;
}
if (ok) out << "DA" << endl;
nr_teste--;
}
in.close();
out.close();
return 0;
}