Pagini recente » Cod sursa (job #2000507) | Cod sursa (job #2852922) | Cod sursa (job #1373053) | Cod sursa (job #1723825) | Cod sursa (job #2854874)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
#define NMAX 50005
#define infinit (1<<30)-1
int t, n, m, s, a, b, c, dist[NMAX];
vector<pair<int, int>> ad[NMAX]; /// {indice, cost}
priority_queue<pair<int, int>, vector <pair<int, int>>, greater<> > q; ///{cost, indice}
int viz[NMAX], d[NMAX];
void dijkstra (int sursa)
{
for(int i=1; i<=n; i++)
viz[i]=0, d[i]=infinit;
d[sursa]=0;
q.push({0, sursa});
while(!q.empty())
{
int nod=q.top().second;
q.pop();
if(!viz[nod])
{
viz[nod]=1;
for(auto &vecin: ad[nod]){
if(d[nod]+vecin.second<d[vecin.first]){
d[vecin.first]=d[nod]+vecin.second;
q.push({d[vecin.first], vecin.first});
}
}
}
}
bool ok=1;
for(int i=1; i<=n; i++)
if(d[i]!=dist[i])
ok=0;
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
int main()
{
fin>>t;
for(int i=1; i<=t; i++)
{
fin>>n>>m>>s;
for(int j=1; j<=n; j++)
fin>>dist[j];
for(int j=1; j<=m; j++){
fin>>a>>b>>c;
ad[a].push_back({b, c});
ad[b].push_back({a, c});
}
dijkstra(s);
for(int j=1; j<=NMAX; j++)
ad[j].clear();
}
return 0;
}