Pagini recente » Cod sursa (job #409936) | Cod sursa (job #2788552) | Cod sursa (job #2271049) | Cod sursa (job #638780) | Cod sursa (job #2829719)
#include <bits/stdc++.h>
using namespace std;
class ComparePair
{
public:
bool operator() (pair<int,int> a, pair<int,int> b)
{
return a.second > b.second; // compar costurile
}
};
int main()
{
ifstream in("distante.in");
ofstream out("distante.out");
int T, N, M, S;
in >> T;
for (int i = 0; i < T; i++)
{
in >> N >> M >> S;
vector<int> distFoaie, distMele(N+1);
vector<vector<pair<int,int>>> lsAdCost(N+1);
for (int j = 0; j < N; j++)
{
int x;
in >> x;
distFoaie.push_back(x);
}
for (int j = 0; j < M; j++)
{
int x, y, c;
in >> x >> y >> c;
lsAdCost[x].push_back({y,c});
lsAdCost[y].push_back({x,c});
}
priority_queue<pair<int,int>,vector<pair<int,int>>,ComparePair> heap; //folosesc un priority queue drept heap
vector<bool> vizitat(N+1);
heap.push(make_pair(S,0));
while (!heap.empty())
{
pair<int,int> tupluCrt = heap.top(); //in tuplu am nodul si costul catre nod
heap.pop();
if (!vizitat[tupluCrt.first])
{
vizitat[tupluCrt.first] = true;
distMele[tupluCrt.first] = tupluCrt.second;
for (auto vecin : lsAdCost[tupluCrt.first])
{
//pentru fiecare vecin il adaug in heap cu costul curent plus costul arcului
heap.push(make_pair(vecin.first,tupluCrt.second + vecin.second));
}
}
}
bool ok = 1;
for (int i = 0; i < N; i++)
if (distFoaie[i] != distMele[i+1])
ok = 0;
if (ok)
out << "DA\n";
else
out << "NU\n";
}
}