Pagini recente » Cod sursa (job #1894293) | Cod sursa (job #2896798) | Cod sursa (job #1170157) | Cod sursa (job #332320) | Cod sursa (job #1119186)
#include <cstdio>
#include <iostream>
#include <vector>
#include <set>
using namespace std;
#define INF 1000000000
vector < vector <int> > nod;
vector < vector <int> > cost;
set < pair <int,int> > T;
int i,n,m,s,d[50001],dc[50001];
void citeste()
{
int a,b,c;
for(int k=1;k<=m;k++)
{
scanf("%d %d %d",&a,&b,&c);
nod[a].push_back(b);
nod[b].push_back(a);
cost[a].push_back(c);
cost[b].push_back(c);
}
}
int rezolva()
{
T.insert(make_pair(0,s));
d[s]=0;
int a,b;
while(T.size()>0)
{
a=(*T.begin()).first;
b=(*T.begin()).second;
T.erase(T.begin());
if(d[b]!=dc[b])
return 0;
for(int k=0;k<nod[b].size();k++)
if(d[nod[b][k]] > d[b] + cost[b][k])
{
d[nod[b][k]]=d[b]+cost[b][k];
T.insert(make_pair(d[nod[b][k]],nod[b][k]));
}
}
return 1;
}
/*
int corect()
{
for(int k=1;k<=n;k++)
cout<<d[k]<<" ";
cout<<'\n';
for(int k=1;k<=n;k++)
cout<<dc[k]<<" ";
for(int k=1;k<=n;k++)
if(d[k]!=dc[k])
return 0;
return 1;
}*/
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&i);
for(int q=1;q<=i;q++)
{
scanf("%d %d %d",&n,&m,&s);
for(int k=1;k<=n;k++)
{
d[k]=INF;
scanf("%d",&dc[k]);
}
nod.resize(n+1);
cost.resize(n+1);
citeste();
if(rezolva())
printf("DA\n");
else
printf("NU\n");
nod.resize(0);
cost.resize(0);
}
return 0;
}