Pagini recente » Cod sursa (job #1351483) | Cod sursa (job #2054477) | Cod sursa (job #2043814) | Cod sursa (job #2309488) | Cod sursa (job #122832)
Cod sursa(job #122832)
#include <cstdio>
#include <cstdlib>
#include <string>
#define maxn 50001
#define oo 0x3f3f3f3f //infinit ... nu orice valoare functioneaza cu memset!!!
#define tata(i) ((i)>>1) //i/2
#define left(i) ((i)<<1) //2*i
#define right(i) (((i)<<1)|1) // 2*i+1
int d1[maxn], d[maxn];
int H[maxn], poz[maxn];
int nh; // nr de elemente din heap;
struct nod { int x, c; };
nod *a[maxn];
int n;
int source;
inline void swap(int i, int j)
{
int t=H[i];H[i]=H[j]; H[j]=t;
poz[H[i]]=i; poz[H[j]]=j;
}
inline void heapup(int i)
{
if(i<=1)return;
if(d[H[i]] < d[tata(i)] ) swap(i, tata(i)), heapup(tata(i));
}
inline void heapdown(int i)// aleg minimul dintre fii
{
int min=i;
if(left(i) <= nh) if(d[H[i]] > d[H[left(i)]]) min=left(i);
if(right(i) <= nh) if(d[H[i]] > d[H[right(i)]]) min=right(i);
if(i!=min) swap(i, min), heapdown(min);
}
void dijkstra(int S)
{
int i, u;
memset(d, oo, sizeof(d));
d[S]=0;
for(i=1;i<=n;++i) H[i]=i, poz[i]=i;
for(i=1;i<=n;++i) heapup(i);
// for(i=n/2; i>=1; --i) heapdown(i); // creez heapul in O(n)
nh=n;
while(nh)
{
u=H[1]; // aleg nodul cu d[] minim
swap(1, nh--); heapdown(1); // elimin pe u din heap
for(i=1;i<=a[u][0].x;++i)
if(d[u]+a[u][i].c < d[a[u][i].x])
{
d[a[u][i].x]=d[u]+a[u][i].c;
heapup(poz[a[u][i].x]);
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int m, T,i,p,q,c;
scanf("%d\n", &T);
while(T--)
{
scanf("%d %d %d\n", &n, &m, &source);
for(i=1;i<=n;++i) scanf("%d ", &d1[i]);
for(i=1;i<=n;++i) a[i]=(nod *)realloc(a[i], sizeof(nod)*2), a[i][0].x=0; //a[i][0].x=lungimea listei a[i]
// a[i][j].x=nodul, a[i][j].c=costul j=1, a[i][0].x
while(m--)
{
scanf("%d %d %d\n", &p, &q, &c);
//printf("%d %d %d\n", p, q, c);
a[p]=(nod*)realloc(a[p], sizeof(nod)*(a[p][0].x+2));
a[q]=(nod*)realloc(a[q], sizeof(nod)*(a[q][0].x+2));
nod t;
t.x=q;t.c=c;
a[p][++a[p][0].x]=t;
t.x=p;
a[q][++a[q][0].x]=t;
}
dijkstra(source);
int ok=1;
//for(i=1;i<=n;++i)printf("%d ", d[i]);
for(i=1;i<=n;++i)if(d[i]!=d1[i]) {ok=0;break;}
if(ok)printf("DA\n");
else printf("NU\n");
}
return 0;
}