Pagini recente » Cod sursa (job #2402274) | Cod sursa (job #1624844) | Cod sursa (job #1513546) | Cod sursa (job #2035972) | Cod sursa (job #1546918)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define DIM 100005
#define INF 2000000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int N, M, source, numberVertiges;
int D[DIM], D2[DIM], a, b, c, T, ok[DIM];
pair< int, int > p;
bitset< DIM >v;
vector<pair < int, int> > L[DIM];
//folosesc heap pentru complexitate de timp(este un arbore binar de cautare )
struct cmp {
bool operator()(pair<int, int> a, pair<int, int> b) {
return a.first > b.first;
}
};
priority_queue<pair<int, int>, vector< pair<int, int> >, cmp> H;
bool dijkstra(int source)
{
D[source] = 0;
H.push(make_pair(0, source));
while(!H.empty()){
pair<int, int> st = H.top();
H.pop();
v[st.second] = 1;
//D[st.second] = st.first;
for(int i = 0 ; i < L[st.second].size(); i ++)
{
p = L[st.second][i];
if( !v[p.second] && D[p.second] > D[st.second] + p.first){
D[p.second] = D[st.second] + p.first;
H.push(make_pair(D[p.second], p.second));
}
}
}
for(int i = 1; i <= N; i ++)
{
if(D[i] != D2[i])
{
return false;
}
}
return true;
}
int main()
{
fin >> T;
while(T --)
{
fin >> N >> M >> source;
for(int i = 1; i <= N; i ++)
{
fin >> D2[i];
D[i] = INF;
L[i].clear();
v[i] = 0;
}
for(int i = 1; i <= M; i ++)
{
fin >> a >> b >> c;
L[a].push_back(make_pair(c, b));
L[b].push_back(make_pair(c, a));
}
if(dijkstra(source))
{
fout << "DA\n";
}
else
{
fout << "NU\n";
}
}
return 0;
}