Cod sursa(job #171154)

Utilizator nimeniaPaul Grigoras nimenia Data 3 aprilie 2008 19:27:15
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.94 kb
#include <stdio.h>
const long NMAX=50001;
struct nod{
	nod *urm;
	int cost,nd;

} *p[NMAX],*aux,*auxx;

int dd[NMAX],n,m,x,y,c,s[NMAX],k,min,j,gasit,pinf=2147483647;
int dim_heap,poz[NMAX],dbronzarel[NMAX];

struct frunza{int cost,nod; } d[NMAX];

inline int parinte(int i) {return i/2;}
inline int stanga(int i) {return 2*i;}
inline int dreapta(int i) {return 2*i+1;}

void reconstituie_heap(int i){
     int minim,t;
     int st=stanga(i);
     int dr=dreapta(i);
     
     if (st<=dim_heap && d[i].cost>d[st].cost) {minim=st;}
     else minim=i;
     if (dr<=dim_heap && d[dr].cost<d[minim].cost) {minim=dr;}
     
     if (minim!=i) {
                    poz[d[i].nod]=minim;
                    poz[d[minim].nod]=i;
                    
                    t=d[i].cost, d[i].cost=d[minim].cost,d[minim].cost=t;
                    t=d[i].nod, d[i].nod=d[minim].nod, d[minim].nod=t;
                    
                    reconstituie_heap(minim);
                   }
     
     }

int extrage_min(){
	int pz=d[1].nod;min=d[1].cost;
	d[1].cost=d[dim_heap].cost;
	d[1].nod=d[dim_heap].nod;
	dim_heap--;
	reconstituie_heap(1);
	return pz;
	}


void insereaza_in_heap(frunza element ){
	 int i;
	 dim_heap++;i=dim_heap;

	 while(i>1 && element.cost<d[parinte(i)].cost) {poz[d[parinte(i)].nod]=i; d[i].cost=d[parinte(i)].cost; d[i].nod=d[parinte(i)].nod; i=parinte(i);}

	 d[i].cost=element.cost;
	 d[i].nod=element.nod;

	 poz[d[i].nod]=i;

	 }

void update_heap(frunza element){
	int i=poz[element.nod];


	while(i>1 && element.cost<d[parinte(i)].cost) {poz[d[parinte(i)].nod]=i; d[i].cost=d[parinte(i)].cost; d[i].nod=d[parinte(i)].nod; i=parinte(i); }

	d[i].cost=element.cost;
	d[i].nod=element.nod;

	poz[d[i].nod]=i;

	}

int main()
{   int pz,i,sursa,nteste,cont;frunza auxx;
    freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
    scanf("%d",&nteste);
    
    for (cont=0;cont<nteste;cont++){
	scanf("%d%d%d",&n,&m,&sursa);
	for(i=1;i<=n;i++) scanf("%d", &dbronzarel[i]);
	
	for(i=1;i<=n;i++) dd[i]=pinf;
	for(i=1;i<=n;i++) s[i]=0;
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&c);
		aux=new nod;
		aux->urm=p[x];
		aux->nd=y,aux->cost=c;
		p[x]=aux;
		if (x==sursa) {dd[y]=c;auxx.cost=c,auxx.nod=y; insereaza_in_heap(auxx);}
	}

	s[sursa]=1;

	for(i=1;i<=n && dim_heap!=0;i++){
	    if (i!=sursa) {        
    	pz=extrage_min();
        
        s[pz]=1;
		for(aux=p[pz];aux!=NULL;aux=aux->urm)
		 if(!s[aux->nd])
		 {	if (dd[aux->nd]>dd[pz]+aux->cost){
                auxx.nod=aux->nd, auxx.cost=dd[pz]+aux->cost;
				if (dd[aux->nd]==pinf) insereaza_in_heap(auxx);
				else update_heap(auxx);
                dd[aux->nd]=dd[pz]+aux->cost;}
		 }}
	}
    dd[sursa]=0;int da=1;
    for(i=1;i<=n;i++) if (dd[i]==pinf) dd[i]=0;
	for(i=1;i<=n && da;i++)
	 if (dd[i]!=dbronzarel[i]) {printf("NU\n");da=0;}

    if (da) printf("DA\n");

  }
	return 0;
}