Cod sursa(job #337396)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 3 august 2009 15:38:49
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <stdio.h>
#include <string.h>
#define Nmax 150005
#define INF 2000000000
struct nod{
	int y,c;
   nod* next;
} *a[Nmax];

int h[Nmax],d[Nmax],db[Nmax],poz[Nmax];
int n,m,s,dh;

void swap(int i,int j){
	int aux=h[i]; h[i]=h[j];
   h[j]=aux;
   poz[h[i]]=i;
   poz[h[j]]=j;
}

void DOWN(int k){
	int st=2*k,dr=st+1,min=k;
   if(st<=dh && d[h[st]]<d[h[min]]) min=st;
   if(dr<=dh && d[h[dr]]<d[h[min]]) min=dr;
   if(min != k){
   	swap(k,min);
      DOWN(min);
   }
}

void UP(int k){
	int tata=k/2;
   if(tata)
     if(d[h[k]] < d[h[tata]]){
     		swap(k,tata);
         UP(tata);
     }
}

void dijkstra(){
   int pmin; nod* p;
	while(dh){
   	//scot min
      swap(1,dh);
      dh--;
      DOWN(1);
      pmin = h[dh+1];
      for(p=a[pmin]; p; p=p->next)
      	if(d[p->y] > d[pmin]+p->c){
         	d[p->y] = d[pmin]+p->c;
            UP(poz[p->y]);
         }
   }
}

int write(){
	int i;
   for(i=1;i<=n;++i)
     if(d[i] != db[i]){
     	 printf("NU\n");
       return 0;
     }
   printf("DA\n");
   return 0;
}

void work(){
	int t,i,x,y,c;
   nod* aux;
	freopen("distante.in","r",stdin);
   freopen("distante.out","w",stdout);
   scanf("%d",&t);
   for(; t; --t){
      memset(a,NULL,Nmax);
   	scanf("%d%d%d",&n,&m,&s);
      for(i=1;i<=n;++i) scanf("%d",&db[i]);
      for(i=1;i<=m;++i){
      	scanf("%d%d%d",&x,&y,&c);
         aux = new nod;
         aux ->y =y;
         aux ->c =c;
         aux ->next=a[x];
         a[x] = aux;
         aux = new nod;
         aux ->y =x;
         aux ->c =c;
         aux ->next=a[y];
         a[y]=aux;
      }
      for(i=1;i<=n;++i){
      	d[i]=INF;
         h[i]=poz[i]=i;
      }
      d[s]=0;
      UP(poz[s]);
      dh=n;
      dijkstra();
      write();
   }
      fclose(stdin); fclose(stdout);
}

int main(){
	work();
   return 0;
}