Pagini recente » Cod sursa (job #1628106) | Cod sursa (job #1307900) | Cod sursa (job #518940) | Cod sursa (job #2460925) | Cod sursa (job #266692)
Cod sursa(job #266692)
#include<cstdio>
long *x[50001], n, *cost[50001], costMinim[50001], coada[50005]={0};
void citire()
{
long m,a,b,c;
scanf("%d",&m);
for ( long 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 ( long i = 1; i <= n; ++i )
{
for ( long j = 1; j <= x[i][0]; ++j )
printf(", %d -> %d 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("%d ",&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("%d ", costMinim[i]);
//afiseaza_listaSIcosturi();
fclose(stdout);
return 0;
}