Pagini recente » Cod sursa (job #1919426) | Cod sursa (job #1006796) | Cod sursa (job #794394) | Cod sursa (job #440925) | Cod sursa (job #502332)
Cod sursa(job #502332)
#include<cstdio>
#include<queue>
#include<vector>
#include<fstream>
using namespace std;
const int N=1<<16;
int n,vec[N],lung[N];
bool proc[N];
priority_queue<pair<int,int> > H;
vector<pair<int,int> > L[N];
ifstream f("distante.in");
void read()
{
int m,ni,x,y,c;
f>>n>>m>>ni;
H.push(make_pair(0,ni));
for(int i=1;i<=n;i++)
f>>vec[i];
for(int i=1;i<=m;i++)
{
f>>x>>y>>c;
L[x].push_back(make_pair(c,y));
L[y].push_back(make_pair(c,x));
}
}
void dijkstra()
{
while(!H.empty())
{
int cost,nod;
cost=H.top().first;
nod=H.top().second;
H.pop();
if(!proc[nod])
{
lung[nod]=cost;
proc[nod]=true;
for(vector<pair<int,int> >::iterator it=L[nod].begin();it!=L[nod].end();it++)
if(!proc[it->second])
H.push(make_pair(cost-it->first,it->second));
}
}
}
bool verif()
{
for(int i=1;i<=n;i++)
if(-lung[i]!=vec[i])
return false;
return true;
}
void empty()
{
for(int i=1;i<=n;i++)
{
while(!L[i].empty())
L[i].pop_back();
lung[i]=0;
proc[i]=false;
}
}
int main()
{
freopen("distante.out","w",stdout);
int t;
f>>t;
while(t--)
{
read();
dijkstra();
if(verif())
printf("DA\n");
else printf("NU\n");
empty();
}
return 0;
}