Cod sursa(job #417454)

Utilizator MikeysMihai Tiganus Mikeys Data 14 martie 2010 13:49:11
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream.h>
#define NMax 50001
#define inf 1000000000
int n,m,*A[NMax],*B[NMax],s,T,dB[NMax],d[NMax];


int dijkstra(int nc)
{
	int i,j,k,min,util[NMax],ind;
	for(i=1;i<=n;i++)
		d[i]=inf;
	memset(util,0,sizeof(util));
	d[nc]=0;
	util[nc]=1;
	for(i=1;i<n;i++)
	{
		for(j=1;j<=A[nc][0];j++)
			if(!util[A[nc][j]] && d[nc]+B[nc][j]<d[A[nc][j]]) 
			{
				d[A[nc][j]]=d[nc]+B[nc][j];
				if(d[A[nc][j]]<dB[A[nc][j]]) return 0;
			}

		j=1;
		while(util[j]) j++;
		min=d[j];
		ind=j;
		for(;j<=n;j++) if(min>d[j] && !util[j]) min=d[j],ind=j;
		nc=ind;
		util[nc]=1;
	}
	//for(i=1;i<=n;i++) if(d[i]!=dB[i]) return 0;
	return 1;
	
}


void citire()
{
	ifstream in("distante.in");
	ofstream out("distante.out");
	int i,j,x,y,c,p;
	in >>T;
	for(j=1;j<=T;j++)
	{
		in >>n>>m>>s;
		for(p=1;p<=n;p++) in >>dB[p];
		for(i=1;i<=n;i++) A[i]=(int*)realloc(A[i],sizeof(int)),B[i]=(int*)realloc(B[i],sizeof(int)),A[i][0]=0;
		for(i=1;i<=m;i++)
		{
			in >>x>>y>>c;
			A[x][0]++;
			A[x]=(int*)realloc(A[x],(A[x][0]+1)*sizeof(int));
			B[x]=(int*)realloc(B[x],(A[x][0]+1)*sizeof(int));
			B[x][A[x][0]]=c;
			A[x][A[x][0]]=y;
			A[y][0]++;
			A[y]=(int*)realloc(A[y],(A[y][0]+1)*sizeof(int));
			B[y]=(int*)realloc(B[y],(A[y][0]+1)*sizeof(int));
			B[y][A[y][0]]=c;
			A[y][A[y][0]]=x;
		}
		//dijkstra
		if(dijkstra(s)) out <<"DA\n";
		else out <<"NU\n";
	}
	out.close();
	in.close();
}
		
		
int main()
{
	citire();
	return 0;
}