Pagini recente » Cod sursa (job #2366211) | Cod sursa (job #2986461) | Cod sursa (job #2081542) | Cod sursa (job #1426713) | Cod sursa (job #2398758)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMax=50005;
const int oo=(1 << 30);
vector <pair <int,int> >v[NMax];
int T,S,N,M,disi[NMax],disf[NMax];
bool in[NMax];
struct comp
{
bool operator()(int x, int y)
{
return disf[x]>disf[y];
}
};
priority_queue <int, vector<int>, comp> coada;
void citeste()
{
fin >> N >> M >> S;
for(int i=1;i<=N;i++)
{
fin >> disi[i];
disf[i]=oo;
in[i]=false;
}
for(int i=1;i<=M;i++)
{
int a,b,c;
fin >> a >> b >> c;
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
}
void djk(int ni)
{
disf[ni]=0;
coada.push(ni);
int nod,vecin,cost;
while(!coada.empty())
{
nod=coada.top();
coada.pop();
in[nod]=true;
for(int i=0;i<v[nod].size();i++)
{
vecin=v[nod][i].first;
cost=v[nod][i].second;
if(disf[nod]+cost<disf[vecin])
{
disf[vecin]=disf[nod]+cost;
if(in[vecin]==false)
{
in[vecin]=true;
coada.push(vecin);
}
}
}
}
}
int main()
{
fin >> T;
for(;T;T--)
{
citeste();
djk(S);
int ok=1;
for(int i=1;i<=N;i++)
if(disi[i]!=disf[i])
ok=0;
if(ok)
fout << "DA" << endl;
else
fout << "NU" << endl;
}
return 0;
}