Pagini recente » Cod sursa (job #1618348) | Cod sursa (job #1214385) | Cod sursa (job #756092) | Cod sursa (job #1943868) | Cod sursa (job #2275187)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
const int MAXN = 50000 + 5,MAXM = 100000 + 5,INF = 2e9;
using namespace std;
typedef pair<int,int> pii;
ifstream in("distante.in");
ofstream out("distante.out");
vector<pii>graf[MAXM];
priority_queue<pii, vector<pii>, greater<pii> >heap;
int n,m,start,dp[MAXN],calc[MAXN];
void initialize(){
for(int i = 1; i <= n; i++)
graf[i].clear();
while(!heap.empty())
heap.pop();
}
void dijsktra(int start){
for(int i = 1; i <= n; i++)
dp[i] = INF;
heap.push({0,start});
dp[start] = 0;
while(heap.size()){
int nod = heap.top().second;
heap.pop();
for(int i = 0; i < graf[nod].size(); i++){
pii curent = graf[nod][i];
int vecin = curent.first,cost = curent.second;
if(dp[nod] + cost < dp[vecin]){
dp[vecin] = dp[nod] + cost;
heap.push({dp[vecin],vecin});
}
}
}
for(int i = 1; i <= n; i++)
if(dp[i] == INF)
dp[i] = 0;
}
string solve(){
initialize();
in>>n>>m>>start;
for(int i = 1; i <= n; i++)
in>>calc[i];
for(int i = 1; i <= n; i ++){
int nod,muchie,cost;
in>>nod>>muchie>>cost;
graf[nod].push_back(make_pair(muchie,cost));
graf[muchie].push_back(make_pair(nod,cost));
}
dijsktra(start);
for(int i = 1; i <= n; i++)
if(dp[i] != calc[i])
return "NU";
return "DA";
}
int main()
{
in.tie(nullptr);
out.tie(nullptr);
ios::sync_with_stdio(false);
int t;
in>>t;
for(int i = 1; i <= t; i++){
out<<solve()<<"\n";
initialize();
}
return 0;
}