Cod sursa(job #535636)

Utilizator petre_mihaiPetrisor Mihai petre_mihai Data 17 februarie 2011 15:54:45
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define dim 50005
#define oo 0x3f3f3f3f
#include<queue>
using namespace std;

int *A[dim],*C[dim],n,m,s,t,T,best[dim],viz[dim],ok,i,x,y,c,V[dim];
queue<int> Q;

FILE *f=fopen("distante.in","r") ,*g=fopen("distante.out","w");

void citire()
{
	fscanf(f,"%d %d %d",&n,&m,&s);
	for(i=1;i<=n;i++)
	{	
		fscanf(f,"%d",&V[i]);
		A[i]=(int *)realloc(A[i],sizeof(int));
		A[i][0]=0;	
		C[i]=(int *)realloc(C[i],sizeof(int));
		C[i][0]=0;	
	}
	
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&x,&y,&c);
		
		if(x!=y)
		{
		A[x][0]++;
		A[x]=(int *)realloc(A[x], (A[x][0]+1) * sizeof(int) );
		A[x][ A[x][0] ]= y;
		
		A[y][0]++;
		A[y]=(int *)realloc(A[y], (A[y][0]+1) * sizeof(int) );
		A[y][ A[y][0] ]= x;
		
		C[x][0]++;
		C[x]=(int *)realloc(C[x], (C[x][0]+1) * sizeof(int) );
		C[x][ C[x][0] ]= c;
		
		C[y][0]++;
		C[y]=(int *)realloc(C[y], (C[y][0]+1) * sizeof(int) );
		C[y][ C[y][0] ]= c;
		}	
	}

}

void djkstra()
{
	while(!Q.empty())
	{
	x=Q.front();
	Q.pop();
	viz[x]=0;
	
	for(i=1;i<=A[x][0];i++)
	{
		y=A[x][i];
		if(best[y] > best[x] + C[x][i] )
		{
			best[y] = best[x] + C[x][i];
			
			if(!viz[y]) {Q.push(y); viz[y]=1;}		
		}
	}
	
	}
return ;
}

int main()
{
	
fscanf(f,"%d",&t);

for(T=1;T<=t;T++)
{
citire();

memset(best,oo,sizeof(best));
	
best[s]=0; 
Q.push(s); 

djkstra();

ok=1;
for(i=1;i<=n;i++)
	{if(best[i]==oo)
		best[i]=0;
	if(best[i]!=V[i] )
	{
		fprintf(g,"NU\n");
		ok=0; 
		break;	
	}
	}
if(ok)
	fprintf(g,"DA\n");

memset(viz,0,sizeof(viz));
memset(A,0,sizeof(A));
memset(C,0,sizeof(C));
}

fclose(f);
fclose(g);

return 0;
}