Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "Graph.h"
  3. #include "QueuePrior.h"
  4.  
  5. //----------------------------------------------------------------------------
  6. double Dijkstra(Vertex* Village, int nSize, int nFirst)
  7. {
  8. PQueue* q = PQInit(nSize); //pusta kolejka prior
  9. double* Pathlen = (double*)calloc(nSize, sizeof(double)); //tablica na wierzcholki grafu
  10. int** Path = NULL; //tablica ścieżek
  11. int **wsk = Path = (int**)(calloc(nSize,sizeof(int*))); //Ścieżki do wierzchołków
  12. if (!Pathlen || !Path )
  13. {
  14. perror("Error creating, no memory!!");
  15. return 10;
  16. }
  17.  
  18. for( int i = 0; i<nSize; i++, wsk++) //Wzięte z CreateMatrix
  19. {
  20. *wsk = (int*)(calloc(nSize,sizeof(int)));
  21. if(! (*wsk) ) return 10;
  22. }
  23.  
  24. for (int z = 0; z<nSize;z++) //Uzupełniam -1
  25. for(int x = 0; x<nSize; x++)
  26. Path[z][x] = -1;
  27.  
  28. for (int i = 0; i < nSize; i++)
  29. Pathlen[i] = INT_MAX;
  30.  
  31. PQEnQueue(q, nFirst, 0);//klucz nFirst a prior 0
  32. Pathlen[nFirst] = 0; // odleglosc do siebie samego = 0 !!
  33.  
  34. Path[nFirst][0] = nFirst; //Przypisuje pierwszy wierzchołek do drogi
  35.  
  36. while (!(PQisEmpty(q)))
  37. {
  38. int k = PQDeQueue(q);
  39.  
  40. if (Village[k].Type)// jesli sklep
  41. {
  42. Village[nFirst].NearestShop = k;// zapamietuje indeks do najblizszego sklepu
  43. Village[nFirst].WayToShop = Pathlen[k];
  44. Village[nFirst].TimeAll = Village[nFirst].WayToShop / SPEED;
  45. Village[nFirst].WhichVertex = Path[k];
  46.  
  47. PQRelease(q);
  48.  
  49. return Pathlen[k]; //zwraca droge do sklepu
  50. }
  51.  
  52. else //to kolejny obieg
  53. for (NItem* j = Village[k].nList; j; j = j->pNext)
  54. {
  55. int Node = j->nKey;
  56.  
  57. if (Pathlen[k] + j->length < Pathlen[Node])
  58. {
  59. Pathlen[Node] = Pathlen[k] + j->length;
  60.  
  61. for( int chuj = 0; chuj < nSize; chuj++)
  62. Path[Node][chuj] = Path[k][chuj]; //Przepisz drogę do dotychczasowego wierzchołka
  63.  
  64. int l = 0;
  65. while ( Path[Node][l] != -1 )
  66. l++;
  67.  
  68. Path[Node][l] = Node; //Dopisz wierzchołek na koniec ścieżki
  69.  
  70. PQEnQueue(q, Node, Pathlen[Node]);
  71. }
  72. }
  73. }
  74. return 0;
  75. }
  76. //---------------------------------------------------------------------------
  77. void DFS(Vertex* Village, int st, int* tabVisited)
  78. {
  79. tabVisited[st] = 1;
  80. NItem* v = Village[st].nList;
  81. while( v )
  82. {
  83. v->time = v->length / SPEED;
  84.  
  85. if ( !tabVisited[v->nKey] )
  86. DFS(Village, v->nKey, tabVisited);
  87.  
  88. v = v->pNext;
  89. }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement