Cod sursa(job #17924)

Utilizator megabyteBarsan Paul megabyte Data 17 februarie 2007 13:52:11
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#define NMAX 50032
#define INF "distante.in"
#define OUF "distante.out"
int cost[NMAX],bit[NMAX],t,n,m,source;
struct nod
{
	int x,cost;
	nod *next;
};
struct lst
{
	nod *p,*q;
	void init()
	{
		p=q=NULL;
	}
	void insert(int nd,int val)
	{
		nod *op;
		op=new nod;
		op->x=nd;op->cost=val;
		if(p==NULL) p=q=op;
		else
		{
			q->next=op;
			q=op;
		}
	}
}list[NMAX];
void delete_list(nod *op)
{
	if(op!=NULL)
	{
		delete_list(op->next);
		delete op;
	}
}

int main()
{
	int k,i,a,b,c,ok,min,val;
	FILE *in,*out;
	nod *op,*mn;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	fscanf(in,"%d",&t);
	for(k=1;k<=t;k++)
	{
		ok=1;
		fscanf(in,"%d %d %d",&n,&m,&source);
		for(i=1;i<=n;i++)
		{
			fscanf(in,"%d",cost+i);
			list[i].init();
		}
		for(i=1;i<=m;i++)
		{
				fscanf(in,"%d %d %d",&a,&b,&c);
				list[a].insert(b,c);
				list[b].insert(a,c);
		}
		if(cost[source]!=0) ok=0;
		else
		{
			for(i=1;i<=n&&ok;i++)
			if(i!=source)
			{
				min=(1<<30);
				op=list[i].p;mn=NULL;
				while(op!=NULL)
				{
					val=cost[op->x]+op->cost;
					if((val)<min&&op->x!=i){ min=val;mn=op;}
					op=op->next;
				}
				if(cost[i]!=min) ok=0;//printf("%d\n",i);}
			}
			op=list[source].p;min=(1<<30);mn=NULL;
			while(op!=NULL)
			{
				if(op->cost<min){mn=op;min=op->cost;}
				op=op->next;
			}
			if(min!=cost[mn->x]) ok=0;
		}
		for(i=1;i<=n;i++) delete_list(list[i].p);
	        if(ok) fprintf(out,"DA\n");
			else fprintf(out,"NU\n");
	}
	fclose(in);fclose(out);
	return 0;
}