Pagini recente » Cod sursa (job #2513272) | Cod sursa (job #3003422) | Cod sursa (job #1491903) | Cod sursa (job #2183822) | Cod sursa (job #2366661)
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#define MAX_long long 99999
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
long long T;
long long N, M, S;
void solve(long long N, long long M, long long S)
{
S--;
vector<long long> givenDist;
vector<long long> dist(N, MAX_long long);
vector< pair<long long, long long> > emptyVec;
vector< vector< pair<long long, long long> > > graph;
for(long long i = 0; i < N; i++){
graph.push_back(emptyVec);
long long val;
f >> val;
givenDist.push_back(val);
}
for(long long i = 0; i < M; i++)
{
long long weight, from, to;
f >> from >> to >> weight;
from--, to--;
graph[from].push_back(make_pair(to, weight));
graph[to].push_back(make_pair(from, weight));
}
set< pair<long long,long long> > minSet;
minSet.insert(make_pair(0, S));
dist[S] = 0;
while(!minSet.empty()){
pair<long long,long long> temporary = *(minSet.begin());
minSet.erase(minSet.begin());
long long currentNode = temporary.second;
for(long long i = 0; i < graph[currentNode].size(); i++){
long long node = graph[currentNode][i].first;
long long weight = graph[currentNode][i].second;
if(dist[node] > dist[currentNode] + weight){
if(dist[node] == MAX_long long)
minSet.erase(make_pair(dist[node], node));
dist[node] = dist[currentNode] + weight;
minSet.insert(make_pair(dist[node], node));
}
}
}
if(givenDist == dist)
g << "DA" << endl;
else
g << "NU" << endl;
}
long long main()
{
f >> T;
for(long long i = 0; i < T; i++){
f >> N >> M >> S;
solve(N,M,S);
}
}