Pagini recente » Cod sursa (job #1715873) | Cod sursa (job #2670491) | Cod sursa (job #3138534) | Cod sursa (job #2797357) | Cod sursa (job #2755595)
#include <fstream>
#include <vector>
#include <deque>
#include <cstring>
#include <queue>
#include <limits.h>
#include <unordered_set>
using namespace std;
ifstream cin("distante.in") ;
ofstream cout("distante.out") ;
int n ;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int q ;
int qq ;
cin >> qq ;
while(qq --)
{
int sursa ;
vector<pair<int, int> > v[50009] ;
int cost[50009], verif[50009] ;
cin >> n >> q >> sursa ;
int expected[50009] ;
for(int f = 1 ; f <= n ; f ++)
cin >> expected[f], cost[f] = INT_MIN, verif[f] = 0 ;;
while(q --)
{
int a, b, c ;
cin >> a >> b >> c ;
v[a].push_back({b, c}) ;
v[b].push_back({a, c}) ;
}
priority_queue<pair<int, int> > pq ;
pq.push({0, sursa}) ; /// intai cost si dupa nod
cost[sursa] = 0 ;
while(pq.size() && n)
{
int nod_val = pq.top().first ;
int nod_curent = pq.top().second ;
pq.pop() ;
if(!verif[nod_curent])
{
verif[nod_curent] = 1 ;
for(int f = 0 ; f < v[nod_curent].size() ; f ++) /// extindem pathul acesta
{
int nod_destinatie = v[nod_curent][f].first ;
int cost_local = v[nod_curent][f].second ;
/// trebuie vazut daca nod_val + cost_local este mai mic ca cost
if(nod_val - cost_local > cost[nod_destinatie])
{
cost[nod_destinatie] = nod_val - cost_local ;
if(cost[nod_destinatie] != expected[nod_destinatie] * -1)n = 0 ;
pq.push({cost[nod_destinatie], nod_destinatie}) ;
}
}
}
}
if(!n)cout << "NU" ;
else cout << "DA" ;
cout << '\n' ;
}
return 0;
}