Pagini recente » Cod sursa (job #375342) | Cod sursa (job #2363278) | Cod sursa (job #2061220) | Cod sursa (job #3265445) | Cod sursa (job #1427601)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
static const int INF = 1000000000;
static const int MAXN = 50001;
typedef pair<int, int> pii;
int dist[MAXN];
bool done[MAXN];
void Dijkstra(const vector<vector<pii>>& G, int src) {
memset(dist, 0x3F, sizeof(dist));
memset(done, 0, sizeof(done));
priority_queue<pii, vector<pii>, greater<pii>> q;
dist[src] = 0;
q.push(pii(0, src));
while(!q.empty()) {
pii crt = q.top();
q.pop();
if(!done[crt.second]) {
done[crt.second] = true;
for(int i = 0, l = G[crt.second].size(); i < l; i++) {
if(dist[G[crt.second][i].first] > dist[crt.second] + G[crt.second][i].second) {
dist[G[crt.second][i].first] = dist[crt.second] + G[crt.second][i].second;
q.push(pii(dist[G[crt.second][i].first], G[crt.second][i].first));
}
}
}
}
}
int main() {
int t;
ifstream f("distante.in");
ofstream g("distante.out");
f >> t;
for(int i = 0; i < t; i++) {
int n, m, s, a, b, c;
f >> n >> m >> s;
s--;
vector<int> dz(n);
vector<vector<pii>> G(n, vector<pii>());
for(int j = 0; j < n; j++) {
f >> dz[j];
}
for(int j = 0; j < m; j++) {
f >> a >> b >> c;
a--; b--;
G[a].push_back(pii(b, c));
G[b].push_back(pii(a, c));
}
Dijkstra(G, s);
bool are_equal = true;
for(int j = 0; j < n; j++) {
if(dz[j] != dist[j]) {
are_equal = false;
break;
}
}
if(are_equal) {
g << "DA\n";
}
else {
g << "NU\n";
}
}
f.close();
g.close();
return 0;
}