Cod sursa(job #252304)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 4 februarie 2009 10:48:48
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<stdio.h>
const int Nmax=50010;
long i,viz[Nmax],n,m,d[Nmax],s;
int t,gasit,qw;
struct coada
{
long inf;
coada *urm;
}*c,*ultim;

struct elem
{
long inf;
int cost;
elem *urm;
}*a[Nmax];

void citire()
{
long x,y,co,i;
elem *p;
scanf("%ld%ld%ld",&n,&m,&s);
for(i=1;i<=n;i++)
	scanf("%ld",&d[i]);
for(i=0;i<m;i++)
	{
	scanf("%ld%ld%ld",&x,&y,&co);
	p=new elem;
	p->inf=y;
	p->cost=co;
	p->urm=a[x];
	a[x]=p;

	p=new elem;
	p->inf=x;
	p->cost=co;
	p->urm=a[y];
	a[y]=p;
	}
}

void init()
{
 for(int i=1;i<Nmax;i++)
 {
	a[i]->urm=NULL;
	a[i]=NULL;
 }
}

int main()
{
 elem *p;
 freopen("distante.in","r",stdin);
 freopen("distante.out","w",stdout);
 scanf("%d",&t);
 for(int qw=0;qw<t;qw++)
 {
	init();
	citire();
	gasit=0;
	for(i=1;i<=n && !gasit;i++)
	{
		if(i==s)
		 {
			if( d[i]!=0)
			{
				printf("NU\n");
				gasit=1;
			}
		 }
		else
		{
			p=a[i];
			while(a[i]!=NULL && !gasit)
			{
				if(a[i]->inf==s)
				{
					if(a[i]->cost<d[i])
					{
						a[i]=p;
						printf("NU\n");
						gasit=1;
					}
				}
				else
					if(d[i]>d[a[i]->inf]+a[i]->cost)
					{
						a[i]=p;
						printf("NU\n");
						gasit=1;
					}
				a[i]=a[i]->urm;
			}
			a[i]=p;
		}
	}
 if(gasit==0)
	printf("DA\n");
 }

 fclose(stdin);
 fclose(stdout);
 return 0;
}