Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define NUM_NODES 100
  4. #define NONE 9999
  5. //#define SLL
  6. //#define DLL
  7. #define DYN_ARR
  8.  
  9. #if defined(SLL)
  10. #include "../synch_implementations/cdsl_queue.h"
  11. #endif
  12. #if defined(DLL)
  13. #include "../synch_implementations/cdsl_deque.h"
  14. #endif
  15. #if defined(DYN_ARR)
  16. #include "../synch_implementations/cdsl_dyn_array.h"
  17. #endif
  18.  
  19. #if defined(SLL)
  20. cdsl_sll *qHead;
  21. iterator_cdsl_sll it ;
  22. #elif defined(DLL)
  23. cdsl_dll *qHead;
  24. iterator_cdsl_dll it ;
  25. #else
  26. cdsl_dyn_array *qHead;
  27. iterator_cdsl_dyn_array it;
  28. #endif
  29.  
  30. struct _NODE
  31. {
  32. int iDist;
  33. int iPrev;
  34. };
  35. typedef struct _NODE NODE;
  36.  
  37. struct _QITEM
  38. {
  39. int iNode;
  40. int iDist;
  41. int iPrev;
  42. };
  43. typedef struct _QITEM QITEM;
  44.  
  45.  
  46. int AdjMatrix[NUM_NODES][NUM_NODES];
  47.  
  48. int g_qCount = 0;
  49. NODE rgnNodes[NUM_NODES];
  50. int ch;
  51. int iPrev, iNode;
  52. int i, iCost, iDist;
  53.  
  54.  
  55. void print_path (NODE *rgnNodes, int chNode)
  56. {
  57. if (rgnNodes[chNode].iPrev != NONE)
  58. {
  59. print_path(rgnNodes, rgnNodes[chNode].iPrev);
  60. }
  61. printf (" %d", chNode);
  62. fflush(stdout);
  63. }
  64.  
  65.  
  66. void enqueue (int iNode, int iDist, int iPrev)
  67. {
  68. QITEM *qNew = (QITEM *) malloc(sizeof(QITEM));
  69. // QITEM *qLast = qHead;
  70. it = qHead -> iter_begin(qHead);
  71.  
  72. if (!qNew)
  73. {
  74. fprintf(stderr, "Out of memory.\n");
  75. exit(1);
  76. }
  77. qNew->iNode = iNode;
  78. qNew->iDist = iDist;
  79. qNew->iPrev = iPrev;
  80.  
  81. qHead->enqueue(0, qHead, (void*)qNew);
  82. g_qCount++;
  83.  
  84. /* if (!qLast)
  85. {
  86. qHead = qNew;
  87. }
  88. else
  89. {
  90. while (qLast->qNext) qLast = qLast->qNext;
  91. qLast->qNext = qNew;
  92. }
  93. g_qCount++;
  94. */
  95. }
  96.  
  97. void dequeue (int *piNode, int *piDist, int *piPrev)
  98. {
  99. it = qHead -> iter_begin(qHead);
  100. QITEM *temp = (QITEM*)(qHead->iter_deref(qHead,it));
  101. if(g_qCount != 0){
  102. *piNode = temp -> iNode;
  103. *piDist = temp -> iDist;
  104. *piPrev = temp -> iPrev;
  105. g_qCount --;
  106. }
  107. qHead -> dequeue(0,qHead);
  108. }
  109.  
  110.  
  111. int qcount (void)
  112. {
  113. return(g_qCount);
  114. }
  115.  
  116. int dijkstra(int chStart, int chEnd)
  117. {
  118.  
  119.  
  120.  
  121. for (ch = 0; ch < NUM_NODES; ch++)
  122. {
  123. rgnNodes[ch].iDist = NONE;
  124. rgnNodes[ch].iPrev = NONE;
  125. }
  126.  
  127. if (chStart == chEnd)
  128. {
  129. printf("Shortest path is 0 in cost. Just stay where you are.\n");
  130. }
  131. else
  132. {
  133. rgnNodes[chStart].iDist = 0;
  134. rgnNodes[chStart].iPrev = NONE;
  135.  
  136. enqueue (chStart, 0, NONE);
  137.  
  138. while (qcount() > 0)
  139. {
  140. dequeue (&iNode, &iDist, &iPrev);
  141. for (i = 0; i < NUM_NODES; i++)
  142. {
  143. if ((iCost = AdjMatrix[iNode][i]) != NONE)
  144. {
  145. if ((NONE == rgnNodes[i].iDist) ||
  146. (rgnNodes[i].iDist > (iCost + iDist)))
  147. {
  148. rgnNodes[i].iDist = iDist + iCost;
  149. rgnNodes[i].iPrev = iNode;
  150. enqueue (i, iDist + iCost, iNode);
  151. }
  152. }
  153. }
  154. }
  155.  
  156. printf("Shortest path is %d in cost. ", rgnNodes[chEnd].iDist);
  157. printf("Path is: ");
  158. print_path(rgnNodes, chEnd);
  159. printf("\n");
  160. }
  161. }
  162.  
  163. int main(int argc, char *argv[]) {
  164. int i,j,k;
  165. FILE *fp;
  166.  
  167. #if defined(SLL)
  168. qHead = cdsl_sll_init();
  169. #elif defined(DLL)
  170. qHead = cdsl_dll_init();
  171. #else
  172. qHead = cdsl_dyn_array_init();
  173. #endif
  174.  
  175. if (argc<2) {
  176. fprintf(stderr, "Usage: dijkstra <filename>\n");
  177. fprintf(stderr, "Only supports matrix size is #define'd.\n");
  178. }
  179.  
  180. /* open the adjacency matrix file */
  181. fp = fopen (argv[1],"r");
  182.  
  183. /* make a fully connected matrix */
  184. for (i=0;i<NUM_NODES;i++) {
  185. for (j=0;j<NUM_NODES;j++) {
  186. /* make it more sparce */
  187. fscanf(fp,"%d",&k);
  188. AdjMatrix[i][j]= k;
  189. }
  190. }
  191.  
  192. /* finds 10 shortest paths between nodes */
  193. for (i=0,j=NUM_NODES/2;i<20;i++,j++) {
  194. j=j%NUM_NODES;
  195. dijkstra(i,j);
  196. }
  197. exit(0);
  198.  
  199.  
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement