Pagini recente » Cod sursa (job #2002247) | Istoria paginii runda/trainingtsa3 | Cod sursa (job #698879) | Istoria paginii utilizator/laviniumarius99 | Cod sursa (job #177569)
Cod sursa(job #177569)
#include<stdio.h>
struct Nod {
int d,cost;
Nod *urm;
};
struct NodHeap {
int v;
int cost;
};
Nod *a[50002];
NodHeap Heap[100000];
int pozheap[50002],tc,ss;
int dist[50002];
int i,s,d,cost,op2,op,n,m,dimheap;
int insert(Nod *&k,int op,int op2)
{
Nod *x = new Nod;
x->d=op;
x->cost=op2;
x->urm=k;
k=x;
}
int intrschmb(NodHeap &t1,NodHeap &t2)
{
NodHeap aux;
int aux2;
aux=t1;
aux2=pozheap[t1.v];
pozheap[t1.v]=pozheap[t2.v];
t1=t2;
pozheap[t2.v]=aux2;
t2=aux;
return 0;
}
int Heapify(int source)
{
int val=source;
if (2*source+1<=dimheap)
if (Heap[2*source].cost<Heap[2*source+1].cost) val=2*source;
else val=2*source+1;
else
if (2*source<=dimheap) val=2*source;
if (Heap[val].cost<Heap[source].cost)
{
intrschmb(Heap[val],Heap[source]);
Heapify(val);
}
return 0;
}
NodHeap ExtractMin()
{
NodHeap aux;
aux=Heap[1];
intrschmb(Heap[1],Heap[dimheap]);
dimheap--;
Heapify(1);
return aux;
}
int Update(int poz1,int cst)
{
Heap[poz1].cost=cst;
while (Heap[poz1].cost<Heap[poz1/2].cost&&poz1!=1)
{
intrschmb(Heap[poz1],Heap[poz1/2]);
poz1/=2;
}
return 0;
}
int BuildHeap(int aux)
{
dimheap++;
pozheap[aux]=dimheap;
Heap[dimheap].v=aux;
Heap[dimheap].cost=1000000000;
Update(pozheap[aux],Heap[dimheap].cost);
}
int Dijkstra(int source)
{
NodHeap aux;
Nod *i;
int j;
for(j=1;j<=n;j++)
BuildHeap(j);
Update(pozheap[source],0);
while(dimheap)
{
aux=ExtractMin();
if (dist[aux.v]!=aux.cost) return 0;
for(i=a[aux.v];i!=NULL;i=i->urm)
if (aux.cost+i->cost<Heap[pozheap[i->d]].cost)
Update(pozheap[i->d],aux.cost+i->cost);
}
return 1;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&tc);
while(tc)
{
tc--;
for(i=1;i<=n;i++)
a[i]=NULL;
scanf("%d %d %d",&n,&m,&ss);
for(i=1;i<=n;i++)
scanf("%d",&dist[i]);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&s,&d,&cost);
insert(a[s],d,cost);
insert(a[d],s,cost);
}
if (Dijkstra(ss))
printf("DA\n");
else
printf("NU\n");
}
return 0;
}