Pagini recente » Cod sursa (job #904339) | Cod sursa (job #1866527) | Cod sursa (job #1518775) | Cod sursa (job #2041064) | Cod sursa (job #1647701)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 2000000000
using namespace std;
int t,j,n,m,inc,verif[50002],d[50001];
struct graf
{
int nod,val;
};
struct cmp
{
bool operator()(int a, int b)
{
return d[a]>d[b];
}
};
vector <graf> G[50002];
priority_queue <int, vector<int>, cmp> q;
void dijkstra(int inc)
{
q.push(inc);
while(!q.empty())
{
int vf=q.top();
q.pop();
for(int i=0; i<G[vf].size(); i++)
{
if(d[vf]+G[vf][i].val<d[G[vf][i].nod])
{
d[G[vf][i].nod]=d[vf]+G[vf][i].val;
q.push(G[vf][i].nod);
}
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int i;
scanf("%d",&t);
for(int j=1; j<=t; j++)
{
scanf("%d %d %d",&n,&m,&inc);
for(i=1; i<=n; i++) scanf("%d",&verif[i]);
for(i=1; i<=m; i++)
{
graf aux;
int x;
scanf("%d %d %d",&x,&aux.nod,&aux.val);
G[x].push_back(aux);
}
for(i=1; i<=n; i++) d[i]=INF;
d[inc]=0;
dijkstra(inc);
bool flag=0;
for(i=1; i<=n && !flag; i++)
{
if(d[i]==INF) d[i]=0;
if(verif[i]!=d[i]) flag=1;
}
if(!flag) printf("DA\n");
else printf("NU\n");
for(i=1; i<=n; i++)
while(G[i].size()) G[i].pop_back();
}
}