Cod sursa(job #236900)

Utilizator eugen.nodeaEugen Nodea eugen.nodea Data 28 decembrie 2008 18:22:32
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
# include <stdio.h>
# include <stdlib.h>
# define nmax 50001
# define inf 500001

long x,y,m,n,i,j,min,ct;
int **A,D[nmax],p[nmax],S[nmax],ok,dr[nmax];
int main()
{
  freopen("dijkstra.in","r",stdin);
  freopen("dijkstra.out","w",stdout);
  scanf("%ld %ld",&n,&m);
  A=(int**) calloc(n+1,sizeof(int *));
  for (i=1;i<=n;i++){
    A[i]=(int *) calloc(n+1,sizeof(int));
    for (j=1;j<=i;j++)
      A[i][j]=A[j][i]=inf;
  }
  for (i=1;i<=m;i++){
    scanf("%ld %ld %ld",&x,&y,&ct);
    A[x][y]=ct;
  }
  for (i=1;i<=n;i++){
	D[i]=A[1][i];
	if (D[i]!=inf) p[i]=1;
  }

  S[1]=1; p[1]=0;
  for (j=1;j<n;j++) {
	ok=0;min=inf;
	for (i=1;i<=n;i++)
	  if (S[i]==0 && D[i]< min) {
			min=D[i];
			y=i;  ok=1;
	  }
	if (ok){
	   S[y]=1;
	   for (i=1;i<=n;i++)
		 if (S[i]==0 && D[i]>D[y]+A[y][i]){
						D[i]=D[y]+A[y][i];
						p[i]=y;
						}
		}
    }
    for (i=2;i<=n;i++)
	if (D[i]!=inf) printf("%d ", D[i]);
		  else printf("0 ");
    return 0;
 }