Pagini recente » Cod sursa (job #2773027) | Cod sursa (job #2597884) | Cod sursa (job #2716886) | Cod sursa (job #2987109) | Cod sursa (job #2923374)
#include <queue>
#include <vector>
#include <cstdio>
using namespace std;
vector <pair<int,int>> graf[50001];
priority_queue <pair< int,int>> h;
const int MAX=1000000100;
int v[50001],dist[50001];
bool inq[50001];
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T,n,m,s,x,y,cost;
scanf("%d",&T);
int l;
int i;
for( l=1; l<=T; l++)
{
scanf("%d%d%d",&n,&m,&s);
for( i=1; i<=n; i++)
{
scanf("%d",&v[i]);
dist[i]=MAX;
}
for( i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&cost);
graf[x].push_back(make_pair(y,cost));
graf[y].push_back(make_pair(x,cost));
}
h.push(make_pair(s,0));
dist[s]=0;
inq[s]=1;
while(h.empty()==false)
{
x=h.top().first;
inq[x]=0;
h.pop();
for(unsigned int i=0; i<graf[x].size(); i++)
{
y=graf[x][i].first;
cost=graf[x][i].second;
if(dist[y]>dist[x]+cost)
{
dist[y]=dist[x]+cost;
if(inq[y]==0)
{
h.push(make_pair(y,-dist[y]));
inq[y]=1;
}
}
}
}
bool ok=1;
for(int i=1; i<=n && ok==1; i++)
{
if(dist[i]!=v[i])
ok=0;
}
if(ok==0)
printf("NU \n");
else
printf("DA \n");
for(int i = 1; i <= n; i++)
graf[i].clear();
}
return 0;
}