Pagini recente » Cod sursa (job #885686) | Cod sursa (job #1061617) | Cod sursa (job #936429) | Cod sursa (job #2788503) | Cod sursa (job #1027261)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
struct muchie {
int nod,dist;
};
struct distnod {
int nod,dist;
};
struct comp {
bool operator()(distnod &a,distnod &b) {
return a.dist > b.dist;
}
};
vector <muchie> v[50005];
vector <muchie> :: iterator it;
priority_queue <distnod,vector<distnod>,comp> q;
int distc[50005];
int dist[50005];
bool viz[50005];
int teste,n,m,s;
muchie mkmuc(int nod,int dist) {
muchie nou;
nou.dist = dist;
nou.nod = nod;
return nou;
}
distnod mkdistnod(int nod,int dist) {
distnod nou;
nou.dist = dist;
nou.nod = nod;
return nou;
}
bool verifica() {
for (int i=1;i<=n;i++) if (dist[i] != distc[i]) return false;
return true;
}
void dijkstra(int s) {
q.push(mkdistnod(s,0));
viz[s] = true;
dist[s] = 0;
while (!q.empty()) {
distnod ct = q.top(); q.pop();
viz[ct.nod] = true;
for (it = v[ct.nod].begin();it != v[ct.nod].end();it++) {
muchie muc = *it;
if (viz[muc.nod]) continue;
if (ct.dist + muc.dist < dist[muc.nod]) {
dist[muc.nod] = ct.dist + muc.dist;
q.push(mkdistnod(muc.nod,dist[muc.nod]));
}
}
}
}
int main() {
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&teste);
while (teste--) {
scanf("%d %d %d",&n,&m,&s);
for (int i=1;i<=n;i++) {
dist[i] = 2000000000;
viz[i] = false;
scanf("%d",&distc[i]);
while (!v[i].empty()) v[i].pop_back();
}
for (int i=1;i<=m;i++) {
int a,b,d;
scanf("%d %d %d",&a,&b,&d);
if (a==b) continue;
v[a].push_back(mkmuc(b,d));
v[b].push_back(mkmuc(a,d));
}
dijkstra(s);
if (verifica()) printf("DA\n");
else printf("NU\n");
}
return 0;
}