Cod sursa(job #266691)

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

int *x[101], n, *cost[101], costMinim[101], coada[101]={0};

void citire()
{
	int m,a,b,c;
	
	scanf("%d",&m);
	
	for ( int i = 1; i <= n; ++i )
	{
		scanf("%d %d %d",&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 ( int i = 1; i <= n; ++i )
	{
		for ( int j = 1; j <= x[i][0]; ++j )
			printf(", %d -> %d cu costul %d", i, x[i][j],cost[i][j]); 
		printf("\n");
	}
} 

int min ( int a, int 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( int a, int in, int sf )
{
	for ( int i = 1; i <= n; ++i )
		if ( coada[i] == a )
			return 1;
	return 0;
}

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

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

void bff( int in, int sf )
{
	for ( int 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("%d ",&n);  // citesc numaru de noduri si nodul de la care incep(k)
	for ( int i = 1; i <= n; ++i )
	{
		x[i] = new int [n];
		cost[i] = new int [n];
		x[i][0] = 0;
	}
	citire();
	
	
	coada[1]=1;
	costMinim[1]=0;
	bff(1,1);
	
	
	for ( int i=2; i <= n; ++i )
		printf("%d ", costMinim[i]);
	//afiseaza_listaSIcosturi();
	
	
	fclose(stdout);
	return 0;
}