Pagini recente » Cod sursa (job #378622) | Cod sursa (job #800706) | Cod sursa (job #2821365) | Cod sursa (job #2115595) | Cod sursa (job #2300121)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define pii pair<int,int>
#define MAX 50000010
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
vector < pii > v[50010];
int t, n, m, prim, ok, a, b, c;
int ddat[50010];
int dmax[50010];
priority_queue < pii , vector < pii >, greater < pii > > cd;
void dijkstra (int prim)
{
int price, nod;
cd.push({0, prim});
while (!cd.empty())
{
price = cd.top().first;
nod = cd.top().second;
if (dmax[nod] < MAX)
{
cd.pop();
continue;
}
dmax[nod] = price;
cd.pop( );
for (auto it : v[nod])
if (dmax[it.second] == MAX)
cd.push({it.first + price, it.second});
}
}
int main()
{
fin >> t;
for (int k = 1; k<=t; k++){
fin >> n >> m >> prim;
for (int i=1; i<=n; i++)
{
dmax[i] = MAX;
fin >> ddat[i];
v[i].clear( );
}
for (int i=1; i<=m; i++){
fin >> a >> b >> c;
v[a].push_back({c, b});
v[b].push_back({c, a});
}
dijkstra(prim);
ok = 1;
for (int i=1; i<=n; i++)
{
if (dmax[i]==MAX && ddat[i] != 0)
ok = 0;
else if (dmax[i]!=ddat[i])
ok = 0;
}
if (ok == 1)
fout << "DA" << '\n';
else
fout << "NU" << '\n';
}
return 0;
}