Pagini recente » Cod sursa (job #2810086) | Cod sursa (job #2819181) | Cod sursa (job #1819763) | Cod sursa (job #2322603) | Cod sursa (job #2654408)
#define fisier "distante"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int N = 50000, M = 2*N, C = 1000, INF = M*C + 1;
#include <vector>
#include <utility>
using pair = std::pair<int, int>;
std::vector<pair> vecini[N];
int n, rad, dist[N];
#include <queue>
bool corect()
{
int distCorecta[N];
bool explorat[N] = {};
for (int i = 0; i < n; i++)
distCorecta[i] = INF;
distCorecta[rad] = 0;
std::priority_queue<pair, std::vector<pair>, std::greater<pair>> pq;
pq.push({0, rad});
while (pq.size())
{
pair arc = pq.top();
pq.pop();
explorat[arc.second] = true;
for (pair vecin: vecini[arc.second])
if (!explorat[vecin.second])
{
int nouaDist = distCorecta[arc.second] + vecin.first;
if (nouaDist < distCorecta[vecin.second])
{
distCorecta[vecin.second] = nouaDist;
pq.push({nouaDist, vecin.second});
}
}
}
for (int i = 0; i < n; i++)
if (dist[i] != distCorecta[i])
return false;
return true;
}
int main()
{
int grafuri;
in >> grafuri;
while (grafuri--)
{
int m;
in >> n >> m >> rad; rad--;
for (int i = 0; i < n; i++)
in >> dist[i];
while (m--)
{
int a, b, cost;
in >> a >> b >> cost;
vecini[--a].push_back({cost, --b});
vecini[b].push_back({cost, a});
}
out << (corect()? "DA": "NU") << '\n';
for (int i = 0; i < n; i++)
vecini[i].clear();
}
}