Pagini recente » Cod sursa (job #557225) | Cod sursa (job #1761466) | Cod sursa (job #562867) | Cod sursa (job #1747633) | Cod sursa (job #2800981)
#include <iostream>
#include <queue>
#include <vector>
#include <stdio.h>
using namespace std;
#define MAXN 50000
#define MAXM 100000
#define MAXVAL 1000
#define INF (MAXN * MAXVAL + 1)
int best[MAXN], v[MAXN];
struct nod{
int node, cost;
bool operator < (const nod &other) const{
return cost > other.cost;
}
};
priority_queue <nod> pq;
vector <nod>arb[MAXN];
void dijkstra(int s){
int i;
nod nodcoada;
pq.push({s, 0});
while(0 < pq.size()){
nodcoada = pq.top();
pq.pop();
if(best[nodcoada.node] == INF){
best[nodcoada.node] = nodcoada.cost;
for(i = 0; i < arb[nodcoada.node].size(); i++){
if(best[arb[nodcoada.node][i].node] == INF){
pq.push({arb[nodcoada.node][i].node, best[nodcoada.node] + arb[nodcoada.node][i].cost});
}
}
}
}
}
int main()
{
FILE *fin, *fout;
int n, m, a, b, i, cost, t, j, st, s;
fin = fopen("distante.in", "r");
fscanf(fin, "%d", &t);
fout = fopen("distante.out", "w");
for(j = 0; j < t; j++){
fscanf(fin, "%d%d%d", &n, &m, &s);
for(i = 0; i < n; i++){
fscanf(fin, "%d", &v[i]);
}
for(i = 0; i < m; i++){
fscanf(fin, "%d%d%d", &a, &b, &cost);
arb[a - 1].push_back({b - 1, cost});
arb[b - 1].push_back({a - 1, cost});
}
for(i = 0; i < n; i++){
best[i] = INF;
}
dijkstra(s - 1);
st = 0;
for(i = 1; i < n; i++){
if(best[i] != v[i]){
st = 1;
}
}
if(st == 0){
fprintf(fout, "DA\n");
}else{
fprintf(fout, "NU\n");
}
}
fclose(fin);
fclose(fout);
return 0;
}