Pagini recente » Cod sursa (job #495398) | Cod sursa (job #2463099) | Cod sursa (job #2827198) | Cod sursa (job #2400592) | Cod sursa (job #2957206)
#include <bits/stdc++.h>
#define oo 2000000000
#define NMAX 1000005
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct muchie
{
int nod, cost;
};
bool operator < (muchie A, muchie B)
{
return A.cost < B.cost;
}
priority_queue<muchie> q;
vector<muchie> L[NMAX];
int t, n, m;
int dist[NMAX], d[NMAX];
bool viz[NMAX];
void dijkstra(int start)
{
for(int i=1; i<=n; i++)
dist[i] = oo, viz[i] = 0;
dist[start] = 0;
muchie aux;
aux.nod = start;
aux.cost = 0;
q.push(aux);
while(!q.empty())
{
aux = q.top();
q.pop();
int nod = aux.nod;
if(!viz[nod])
{
viz[nod] = 1;
for(auto it: L[nod])
{
if(dist[nod] + it.cost < dist[it.nod])
{
//cout<<dist[nod] + it.cost<<" "<< dist[it.nod] <<"\n";
dist[it.nod] = dist[nod] + it.cost;
aux.nod = it.nod;
aux.cost = dist[it.nod];
q.push(aux);
}
}
}
}
}
int main()
{
fin>>t;
while(t--)
{
int start;
fin>>n>>m>>start;
for(int i=1; i<=n; i++)
fin>>d[i];
for(int i=1; i<=m; i++)
{
int x, y, cost;
muchie aux;
fin>>x>>y>>cost;
aux.nod = y;
aux.cost = cost;
L[x].push_back(aux);
aux.nod = x;
L[y].push_back(aux);
}
dijkstra(start);
bool ok = 1;
for(int i=1; i<=n; i++)
{
//cout<<d[i]<<" "<<dist[i]<<"\n";
if(dist[i] != d[i])
{
ok = 0;
break;
}
}
for(int i=1; i<=n; i++)
L[i].clear();
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
return 0;
}