Pagini recente » Cod sursa (job #676296) | Cod sursa (job #2408776) | Cod sursa (job #1740393) | Cod sursa (job #2748326) | Cod sursa (job #1162097)
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
#define NMax 50003
#define INF 1<<28
using namespace std;
ifstream fin("distanta.in");
ofstream fout("distanta.out");
int n,m,s,t,x;
int nod1,nod2,cost,d[NMax];
std::vector<int> a,g[NMax],c[NMax];
bool dijkstra(int x)
{
std::queue< std::pair<int,int> > coada;
fill(d+1,d+n+1,INF);
d[x] = 0;
coada.push(std::make_pair(x,0));
while(coada.empty()==0)
{
int val = (coada.front()).second;
int nod = (coada.front()).first;
coada.pop();
for(int i=0;i<g[nod].size();++i)
{
if(d[g[nod][i]] > val + c[nod][i])
{
d[g[nod][i]] = val + c[nod][i];
coada.push( std::make_pair(g[nod][i],d[g[nod][i]]) );
}
}
}
for(int i=1;i<=n;++i)if(d[i]!=a[i])return 1;
return 0;
}
int main()
{
fin>>t;
for(int k=1;k<=t;++k)
{
fin>>n>>m>>s;
a.push_back(0);
for(int i=1;i<=n;++i)
{
fin>>x;
a.push_back(x);
g[i].clear();
c[i].clear();
}
for(int i=1;i<=m;++i)
{
fin>>nod1>>nod2>>cost;
g[nod1].push_back(nod2);
c[nod1].push_back(cost);
g[nod2].push_back(nod1);
c[nod2].push_back(cost);
}
if(dijkstra(s)==1)fout<<"NU"<<'\n';
else fout<<"DA"<<'\n';
a.clear();
}
return 0;
}