Pagini recente » Cod sursa (job #1057464) | Cod sursa (job #1585225) | Cod sursa (job #1668161) | Cod sursa (job #428331) | Cod sursa (job #3157157)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin ("distante.in");
ofstream cout ("distante.out");
vector < pair <int , int> > adiacenta[50001];
int distanta[2][50001];
bool adaugat[50001];
int main ()
{
int numar_teste;
cin >> numar_teste;
while (numar_teste--)
{
int numar_noduri , numar_muchii , nod_sursa;
cin >> numar_noduri >> numar_muchii >> nod_sursa;
for (int indice = 1 ; indice <= numar_noduri ; indice++)
{ cin >> distanta[0][indice]; distanta[1][indice] = 1e9; }
for (int indice = 1 , nod[2] , cost ; indice <= numar_muchii ; indice++)
{ cin >> nod[0] >> nod[1] >> cost; adiacenta[nod[0]].push_back(make_pair(nod[1] , cost)); adiacenta[nod[1]].push_back(make_pair(nod[0] , cost)); }
adaugat[nod_sursa] = true;
priority_queue < pair <int , int> > optiuni;
optiuni.push(make_pair(distanta[1][nod_sursa] = 0 , nod_sursa));
while (!optiuni.empty())
{
const int nod_actual = optiuni.top().second;
optiuni.pop();
for (auto nod_vecin : adiacenta[nod_actual])
if (distanta[1][nod_actual] + nod_vecin.second < distanta[1][nod_vecin.first])
{
distanta[1][nod_vecin.first] = distanta[1][nod_actual] + nod_vecin.second;
if (!adaugat[nod_vecin.first]) {
optiuni.push(make_pair(-distanta[1][nod_vecin.first] , nod_vecin.first));
adaugat[nod_vecin.first] = true;
}
}
adaugat[nod_actual] = false;
}
bool diferit = false;
for (int indice = 1 ; indice <= numar_noduri && !diferit ; indice++)
diferit |= (distanta[0][indice] != distanta[1][indice]);
for (int indice = 1 ; indice <= numar_noduri ; indice++)
adiacenta[indice].clear();
cout << (diferit ? "NU\n" : "DA\n");
}
cout.close(); cin.close();
return 0;
}