Cod sursa(job #177569)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 13 aprilie 2008 12:08:29
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#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;
}