Herowaree

dijkstra

May 22nd, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. long int extract_min(long int* dist, long int* visited, long int size){
  5. long int min_value = LONG_MAX, min_index;
  6. for(long int i = 0; i < size; i++){
  7. if(visited[i] == 0 && dist[i] < min_value){
  8. min_index = i;
  9. min_value = dist[i];
  10. }
  11. }
  12. return min_index;
  13. }
  14.  
  15. void dijkstra(long int n, long int graph
  16. [n][n], long int source, long int destiny){
  17. // initialize single source
  18. long int dist[n], visited[n], predecessor[n];
  19. for(long int i = 0; i < n; i++){
  20. dist[i]= LONG_MAX;
  21. visited[i] = 0;
  22. }
  23.  
  24. predecessor[source] = -1;
  25. dist[source] = 0;
  26.  
  27. for(long int i = 0; i < n - 1; i++){
  28. long int u = extract_min(dist, visited, n);
  29. visited[u] = 1;
  30.  
  31. for(long int j = 0; j < n; j++){
  32. if(visited[j] == 0 && graph[u][j] != 0 && dist[j] > dist[u] + graph[u][j]){
  33. dist[j] = dist[u] + graph[u][j];
  34. predecessor[j] = u;
  35. }
  36. }
  37. }
  38.  
  39. printf("%ld\n", dist[destiny]);
  40.  
  41. // Show path
  42. //long int v = predecessor[destiny];
  43. //printf("%ld", destiny);
  44. //while(v != -1){
  45. // printf(" %ld", v);
  46. // v = predecessor[v];
  47. //}
  48. //printf("\n");
  49. }
  50.  
  51. int main(void) {
  52. long int n;
  53.  
  54. scanf("%ld", &n);
  55.  
  56. long int graph[n][n];
  57. long int weight;
  58.  
  59. for(long int i = 0; i < n-1; i++){
  60. for(long int j = 0; j < n - 1 - i; j++){
  61. scanf("%ld", &weight);
  62. graph[i][j+i+1] = weight;
  63. graph[i+j+1][i] = weight;
  64. }
  65. graph[i][i] = 0;
  66. }
  67. graph[n-1][n-1] = 0;
  68.  
  69. dijkstra(n, graph, 0, n - 1);
  70.  
  71. return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment