Cod sursa(job #266694)

Utilizator eddieOlariu Eduard Iuliu eddie Data 25 februarie 2009 23:43:39
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<cstdio>

long *x[50001], n, *cost[50001], costMinim[50001], coada[50005]={0};

void citire()
{
	long m,a,b,c;
	
	scanf("%ld",&m);
	
	for ( long i = 1; i <= n; ++i )
	{
		scanf("%ld %ld %ld",&a,&b,&c);
		++x[a][0];
		++x[b][0];
		x[a][x[a][0]] = b;
		x[b][x[b][0]] = a;
		cost[a][x[a][0]] = c;
		cost[b][x[b][0]] = c;
		costMinim[i]=-1;
	}
}

/*void afiseaza_listaSIcosturi()
{
	for ( long i = 1; i <= n; ++i )
	{
		for ( long j = 1; j <= x[i][0]; ++j )
			printf(", %ld -> %ld cu costul %d", i, x[i][j],cost[i][j]); 
		printf("\n");
	}
} */

int min ( long a, long b )
{
	if ( a <= b )
		return a;
	return b;
}

int max ( int a, int b )
{
	if ( a <= b )
		return b;
	return a;
}

int e_in_coada( long a, long in, long sf )
{
	for ( long i = 1; i <= n; ++i )
		if ( coada[i] == a )
			return 1;
	return 0;
}

void add_coada ( long a, long in, long &sf )
{
	if ( sf == n+1 && in > 1)
		sf = 0;
	else
		if ( in == n+1 )
			in = 1;
	sf++;
	coada[sf]=a;
}

void delete1 ( long &in, long sf )
{
	coada[in]=-1;
	in++;
	if ( in == n+2 )
		in = 1;
}

void bff( long in, long sf )
{
	for ( long i = 1; i <= x[coada[in]][0]; ++i)
		if ( !e_in_coada(x[coada[in]][i], in, sf))
			if ( costMinim[x[coada[in]][i]] == -1 || costMinim[x[coada[in]][i]] > costMinim[coada[in]] + cost[coada[in]][i] )
			{
				add_coada(x[coada[in]][i], in, sf);
				costMinim[x[coada[in]][i]] = costMinim[coada[in]] + cost[coada[in]][i];
			}
	if ( in != sf )
	{
		delete1(in,sf);
		bff(in, sf);
	}
}


int main()
{
	freopen("graf.in","r",stdin);
	freopen("graf.out","w",stdout);
	
	int k;
	
	scanf("%ld ",&n);  // citesc numaru de noduri si nodul de la care incep(k)
	for ( long i = 1; i <= n; ++i )
	{
		x[i] = new long [n];
		cost[i] = new long [n];
		x[i][0] = 0;
	}
	citire();
	
	
	coada[1]=1;
	costMinim[1]=0;
	bff(1,1);
	
	
	for ( long i=2; i <= n; ++i )
		printf("%ld ", costMinim[i]);
	//afiseaza_listaSIcosturi();
	
	
	fclose(stdout);
	return 0;
}