Pagini recente » Cod sursa (job #2121679) | Cod sursa (job #273590) | Cod sursa (job #72441) | Cod sursa (job #21946) | Cod sursa (job #2829784)
#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,1001);
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 din nou un priority queue drept heap
vector<bool> vizitat(N+1);
heap.push(make_pair(1,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
if(distMele[vecin.first] > tupluCrt.second + vecin.second)
heap.push(make_pair(vecin.first,tupluCrt.second + vecin.second));
}
}
}
bool egale = 1;
for (int j = 0; j < N && egale; j++)
if (distFoaie[j] != distMele[j+1])
egale = 0;
if (egale)
out << "DA\n";
else
out << "NU\n";
}
}