Pagini recente » Cod sursa (job #1930801) | cuplajesiflux | Cod sursa (job #1376396) | Cod sursa (job #2089545) | Cod sursa (job #2112700)
#include <bits/stdc++.h>
#define NMAX 50005
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct str{
int nod, cost;
bool operator < (const str &other) const{
return cost > other.cost;
}
};
int T, N, M, source;
int d[NMAX], viz[NMAX];
vector <str> v[NMAX];
priority_queue <str> q;
void reset()
{
for (int i = 1; i <= N; i++)
{
v[i].clear();
viz[i] = INF;
}
}
int verif()
{
for (int i = 1; i <= N; i++)
if (viz[i] != d[i])
return 0;
return 1;
}
int main()
{
fin >> T;
while (T--)
{
fin >> N >> M >> source;
reset();
viz[source] = 0;
for (int i = 1; i <= N; i++)
fin >> d[i];
for (int i = 1; i <= M; i++)
{
int x, y, c;
fin >> x >> y >> c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
q.push({source, 0});
while (!q.empty())
{
int nod = q.top().nod;
int cost = q.top().cost;
q.pop();
if (cost != viz[nod]) continue;
vector <str> :: iterator it;
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
str nr = *it;
int nxt = nr.nod;
int cst = nr.cost;
if (viz[nod] + cst < viz[nxt])
{
viz[nxt] = viz[nod] + cst;
q.push({nxt, viz[nxt]});
}
}
}
if (verif())
fout << "DA\n";
else fout << "NU\n";
}
return 0;
}