Pagini recente » Cod sursa (job #2908896) | Cod sursa (job #3231350) | Cod sursa (job #1392653) | Cod sursa (job #663854) | Cod sursa (job #433482)
Cod sursa(job #433482)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
#define ls(st) st<<1
#define father(st) st>>1
#define F first
#define S second
#define INF 0x3f3f3f3f
#define N 50100
int t, n, m, s, k, ok,
d[N], h[N], poz[N], d2[N];
vector < pair<int, int> > a[N];
void downheap(int w){
int son;
while (ls(w) <= k){
son = ls(w);
if (son+1 <= k)
if (d[h[son]] > d[h[son+1]])
++son;
if (d[h[son]] < d[h[w]]){
swap(poz[h[son]], poz[h[w]]);
swap(h[son], h[w]);
w = son;
}
else
return;
}
}
void upheap(int w){
while (w>1 && d[h[w]] < d[h[father(w)]]){
swap(poz[h[w]], poz[h[father(w)]]);
swap(h[w], h[father(w)]);
w = father(w);
}
}
void dijkstra(){
int min, i, nod2, cost2;
while (k){
min = h[1];
swap(h[1], h[k]);
k--;
downheap(1);
for (i = 0; i < a[min].size(); ++i){
nod2 = a[min][i].F; cost2 = a[min][i].S;
if (d[min] + cost2 < d[nod2]){
d[nod2] = d[min] + cost2;
if (poz[nod2] == -1){
poz[nod2] = ++k;
h[k] = nod2;
upheap(k);
}
else
upheap(k);
}
}
}
}
void citire();
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
citire();
return 0;
}
void citire(){
scanf("%d", &t);
int i, x, y, z;
for ( ; t; --t){
scanf("%d %d %d", &n, &m, &s);
for (i = 1; i <= n; i++)
d[i] = INF, poz[i] = -1;
d[s] = 0; poz[s] = 1; h[1] = s; k = 1;
for (i = 1; i <= n; i++){
scanf("%d", &d2[i]);
a[i].clear();
}
for (i = 1; i <= m; i++){
scanf("%d %d %d", &x, &y, &z);
a[x].pb(mp(y,z));
a[y].pb(mp(x,z));
}
dijkstra();
ok = 1;
for (i = 1; i <= n; i++)
if (d[i] != d2[i]){
ok = 0; break;
}
if (ok) printf("DA\n");
else printf("NU\n");
}
}