Pagini recente » Cod sursa (job #2223405) | Cod sursa (job #2643085) | Cod sursa (job #2496016) | Cod sursa (job #1879537) | Cod sursa (job #1045259)
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <set>
using namespace std;
#define INF INT_MAX
ifstream fin ("distante.in");
ofstream fout ("distante.out");
struct pereche{
int vf, ct;
};
vector<pereche> V[50005];
set< pair<int,int> > T;
int main()
{
int t, n, m, s, Dinit[50005], D[50005];
int a; pereche b;
fin >> t;
while(t--){
fin >> n >> m >> s;
for(int i=1;i<=n;i++)
fin >> Dinit[i];
while(m--){
fin >> a >> b.vf >> b.ct;
V[a].push_back(b);
}
for(int i=1;i<=n;i++)
D[i]=INF;
D[s]=0;
T.insert(make_pair(0,s));
int dist, nod;
while(T.size()>0){
dist=(*T.begin()).first;
nod=(*T.begin()).second;
T.erase(*T.begin());
for(int i=0;i<V[nod].size();i++)
if(D[V[nod][i].vf] > dist + V[nod][i].ct){
D[V[nod][i].vf] = dist + V[nod][i].ct;
T.insert(make_pair(D[V[nod][i].vf] , V[nod][i].vf));
}
}
bool ok=true;
for(int i=1;i<=n;i++){
if(D[i]==INF)
D[i]=0;
if(D[i]!=Dinit[i])
ok=false;
}
/*for(int i=1;i<=n;i++)
cout << D[i] << " " << Dinit[i] << " ";
cout << "\n";*/
if(ok)
fout << "DA\n";
else
fout << "NU\n";
}
return 0;
}