Pagini recente » Cod sursa (job #1197887) | Cod sursa (job #2478301) | Cod sursa (job #1405227) | Cod sursa (job #1872109) | Cod sursa (job #2129731)
#include <fstream>
#include <vector>
#include <queue>
#define mp make_pair
#define inf 50000005
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int Nmax = 50005;
vector<int> d(Nmax);
struct compara
{
bool operator()(int x, int y)
{
return d[x] > d[y];
}
};
vector<pair<int, int> > A[Nmax];
priority_queue<int, vector<int>, compara> Q;
void Dijkstra (int start, int&n, vector<bool>&verif)
{
for (int i = 1; i <= n; i++)
d[i] = inf;
d[start] = 0;
Q.push(start);
while (!Q.empty())
{
int nod = Q.top();
Q.pop();
verif[nod] = 0;
for (auto i = 0; i < A[nod].size(); i++)
{
int nod_cur = A[nod][i].first;
int val_cur = A[nod][i].second;
int lungime = d[nod] + val_cur;
if (lungime < d[nod_cur])
{
d[nod_cur] = lungime;
if (verif[nod_cur] == 0)
{
verif[nod_cur] = 1;
Q.push(nod_cur);
}
}
}
}
}
void Clear(int&n)
{
for (int i = 1; i <= n; i++)
A[i].clear();
}
int main()
{
int t;
vector<int> rez(Nmax);
vector<bool> verif(Nmax);
in >> t;
while (t)
{
int n, m, s;
bool OK = true;
in >> n >> m >> s;
for (int i = 1; i <= n; i++)
in >> rez[i];
for (int i = 1; i <= m; i++)
{
int x, y, c;
in >> x >> y >> c;
A[x].push_back(mp(y, c));
A[y].push_back(mp(x, c));
}
Dijkstra(s, n, verif);
for (int i = 1; i <= n; i++)
if (d[i] != rez[i])
{
OK = false;
break;
}
if (OK == true)
out << "DA" << '\n';
else
out << "NU" << '\n';
Clear(n);
t--;
}
return 0;
}