Pagini recente » Cod sursa (job #1183871) | Cod sursa (job #39737) | Cod sursa (job #1794484) | Cod sursa (job #2263046) | Cod sursa (job #1736573)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define NMAX 50005
#define inf 2000000000
using namespace std;
int K;
int N,M,start;
vector<pair<int,int> > graf[NMAX];
priority_queue<pair<int,int> > q;
int da[NMAX];
int d[NMAX];
void djikstra()
{
q.push(make_pair(0,start));
while(!q.empty())
{
int nod = q.top().second;
int cost = -q.top().first;
for(vector<pair<int,int> >::iterator ii = graf[nod].begin();ii!=graf[nod].end();ii++)
{
int x = ii->first;
int c = ii->second;
if(cost + c < d[x])
{
d[x] = cost + c;
q.push(make_pair(-d[x],x));
}
}
q.pop();
}
}
void citire()
{
scanf("%d",&K);
for(int k=1; k<=K; k++)
{
scanf("%d%d%d",&N,&M,&start);
for(int i=1; i<=N; i++)
{
d[i]=inf;
graf[i].clear();
}
d[start]=0;
for(int i=1; i<=N; i++)
scanf("%d",&da[i]);
for(int i=1; i<=M; i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
graf[x].push_back(make_pair(y,c));
graf[y].push_back(make_pair(x,c));
}
djikstra();
int ok=1;
for(int i=1;i<=N;i++)
if(d[i]!=da[i])
{
ok = 0;
break;
}
if(ok) printf("DA\n");
else printf("NU\n");
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
citire();
return 0;
}