Pagini recente » Cod sursa (job #882076) | Cod sursa (job #1350381) | Cod sursa (job #1729629) | Cod sursa (job #2455692) | Cod sursa (job #2482432)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define Nmax 50001
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct NodCost{
int nod,cost;
bool operator <(const NodCost &var)const{
return cost>var.cost;
}
};
vector <NodCost> G[Nmax];
priority_queue <NodCost> q;
int t,dist[Nmax],v[Nmax];
void dijkstra(int start)
{
memset(dist,INF,sizeof dist);
q.push({start,0});
dist[start]=0;
while (!q.empty())
{
int x=q.top().nod;
int y=q.top().cost;
q.pop();
if (y!=dist[x]) continue;
for (auto i: G[x])
{
if (dist[i.nod]>y+i.cost)
{
dist[i.nod]=y+i.cost;
q.push({i.nod,dist[i.nod]});
}
}
}
}
void citire()
{
fin>>t;
for (int i=1;i<=t;i++)
{
int n,m,s;
fin>>n>>m>>s;
for (int i1=1;i1<=n;i1++)
{
fin>>v[i1];
}
for (int i1=1;i1<=m;i1++)
{
int a,b,c;
fin>>a>>b>>c;
G[a].push_back({b,c});
G[b].push_back({a,c});
}
dijkstra(s);
int OK=1;
for (int i1=1;i1<=n;i1++)
{
if (dist[i1]!=v[i1])
{
OK=0;
}
G[i1].clear();
}
if (OK==1)
fout<<"DA";
else
fout<<"NU";
fout<<"\n";
}
}
int main()
{
citire();
return 0;
}