Cod sursa(job #712169)

Utilizator RoswenRus Alexandru Roswen Data 13 martie 2012 08:57:29
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<stdio.h>
#include<string.h>
#define INF 1 << 30
#define N 50005
FILE *f=fopen("distante.in","r"), *g=fopen("distante.out","w");
int d[N], H[N], poz[N], el, n, m,s, r[N];

struct nod
{
	int y, c;
	nod *urm;
} *v[N];

void swap(int &a, int &b)
{
	a=a^b;
	b=a^b;
	a=a^b;
}
void downheap(int k)
{
	int son;
	do
	{
		son=0;
		if(k*2 <= el) son=k*2;
		if(k*2+1 <=el && d[ H [k*2+1] ] < d[ H[k*2] ])
			son= 2*k+1;
		if( d[H[k]] < d[H[son]])
			son=0;
		if(son)
		{
			swap(H[k], H[son]);
			swap(poz[H[k]], poz[H[son]]);
			//poz[H[k]] = son;
			//poz[H[son]] = k;
		}
		k=son;
	} while(son);
}

void upheap(int k)
{
	int val=d[ H[k] ];
	while(val < d[ H[ k/2 ]] && k>1)
	{
		swap(H[k], H[k/2]);
		swap(poz[H[k]], poz[H[k/2]]);
		//poz[H[k]]= k/2;
		//poz[H[k/2]]= k;
		k=k/2;
	}
}
void push(int x)
{
	H[++el]=x;
	poz[x]=el;
	upheap(el);	
}

void rez(int s)
{
	int min;
	for(int i=1; i<=n;i++)
		d[i]= INF;
	for(nod *p=v[s]; p; p=p->urm)
	{
		d[ p->y ]= p->c;
		push(p->y);
	}
	
	while(el)
	{
		min=d[ H[1] ];
		nod *p= v[ H[1] ];
		poz[H[el]]=1;
		H[1]=H[el--];
		downheap(1);
		while(p)
		{
			if ( ( d[p->y] > p->c + min) && ( p->y != s) )
				if(d[p->y]==INF)
				{
					d[p->y]= p->c+min;
					H[++el]=p->y;
					poz[p->y]=el;
					upheap(poz[p->y]);
				}
				else 
				{
					d[p->y]= p->c+min;
					upheap(poz[p->y]);
					
				}
			p=p->urm;
		}
	}
}

void add(int x, int y, int c)
{
	nod *p=new nod;
	p->c=c;
	p->y=y;
	p->urm=v[x];
	v[x]=p;
}

int main()
{
	int T;
	int a, b, c;
	fscanf(f,"%d", &T);
	for(int i=1; i<=T;i++)
	{
		fscanf(f,"%d %d %d", &n, &m, &s);
		for(int i=1; i<=n;i++)
			fscanf(f,"%d ", &r[i]);
		for(int i=1;i<=m;i++)
		{
			fscanf(f,"%d %d %d", &a, &b, &c);
			add(a,b,c);
			add(b,a,c);
		}
	
		rez(s);
	
		int sw=0;
		for(int i=1; i<=n;i++)
			if(d[i]!= INF)
				if(r[i]!= d[i] )
				{
					fprintf(g,"NU\n");
					sw=1;
					break;
				}
		if(!sw)
			fprintf(g,"DA\n");
		memset(v, 0, sizeof(v));
	}
	return 0;
}