Pagini recente » Cod sursa (job #1013807) | Cod sursa (job #2615250) | Cod sursa (job #873870) | Cod sursa (job #1080711) | Cod sursa (job #1587661)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define x first
#define y second
#define NMAX 50007
#define INF 1 << 29
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int T, n, m, Start;
vector < pair < int, int > > v[NMAX];
priority_queue < pair < int, int > > q;
int Dp[NMAX], Viz[NMAX], Corect[NMAX];
void Dijsktra(int Start){
q.push(make_pair(0, Start));
while(! q.empty()){
int Node = q.top().y;
q.pop();
if(Viz[Node] == 0){
Viz[Node] = 1;
for(vector < pair < int, int > > :: iterator it = v[Node].begin(); it != v[Node].end(); ++it)
if(Dp[it->x] > Dp[Node] + it->y){
Dp[it->x] = Dp[Node] + it->y;
q.push(make_pair(-Dp[it->x], it->x));
Viz[it->x] = 0;
}
}
}
}
int main(){
cin >> T;
while(T--){
cin >> n >> m >> Start;
for(int i = 1; i <= n; ++i){
cin >> Corect[i];
Dp[i] = INF;
}
Dp[Start] = 0;
for(int i = 1; i <= m; ++i){
int A, B, C;
cin >> A >> B >> C;
v[A].push_back(make_pair(B, C));
v[B].push_back(make_pair(A, C));
}
Dijsktra(Start);
int ok = 0;
for(int i = 1; i <= n && ok == 0; ++i)
if(Corect[i] != Dp[i] && i != Start)
ok = 1;
if(ok == 0)
cout << "DA\n";
else
cout << "NU\n";
}
return 0;
}