Pagini recente » Cod sursa (job #2269710) | Istoria paginii runda/oji2009112/clasament | Cod sursa (job #2021241) | Istoria paginii runda/1111 | Cod sursa (job #2436679)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX = 50010;
const int infinit = 1<<30;
int D[NMAX];
int D2[NMAX];
int N,M,S;
bool inCoada[NMAX];
struct compara
{
bool operator()(int x,int y)
{
return D[x]>D[y];
}
};
priority_queue<int,vector<int>,compara> coada;
vector<pair<int,int>> G[NMAX];
void reset()
{
for(int i = 1;i<=N;i++)
G[i].clear();
fill(D,D+N+1,infinit);
}
void citeste()
{
fin>>N>>M>>S;
reset();
for(int i = 1;i<=N;i++)
fin>>D2[i];
for(int i = 1;i<=M;i++)
{
int x,y,cost;
fin>>x>>y>>cost;
G[x].push_back({y,cost});
G[y].push_back({x,cost});
}
}
void dijkstra(int nod)
{
D[nod]=0;
coada.push(nod);
inCoada[nod]=true;
while(coada.size())
{
int current = coada.top();
inCoada[current]=false;
coada.pop();
for(int i = 0;i<G[current].size();i++)
{
int vecin = G[current][i].first;
int cost = G[current][i].second;
if(D[current]+cost<D[vecin])
{
D[vecin]=D[current]+cost;
if(!inCoada[vecin])
{
inCoada[vecin]=true;
coada.push(vecin);
}
}
}
}
}
bool check()
{
for(int i = 1;i<=N;i++)
{
if(D[i]!=D2[i])
return false;
}
return true;
}
int main()
{
int t;
fin>>t;
while(t--)
{
citeste();
dijkstra(S);
fout<<((check())?("DA"):("NU"))<<'\n';
}
return 0;
}