Guest User

Untitled

a guest
Jul 17th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.76 KB | None | 0 0
  1. /* wdg_ads_m.c */
  2. /* Alexander Sinko */
  3. /* 08.11.2009 */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <limits.h>
  9.  
  10. #include "wdg_ads_m.h"
  11.  
  12. static int *aMatrix; /* =aMatrix[NrOfNodes][NrOfNodes] */
  13. static int NrOfNodes;
  14.  
  15.  
  16. int GetElementAt(int row, int col){
  17. return *((int*)aMatrix + (NrOfNodes * row) + col);
  18. } /*ElementAt*/
  19.  
  20.  
  21. void SetElementAt(int row, int col, int value){
  22. *((int*)aMatrix + (NrOfNodes * row) + col) = value;
  23. return;
  24. } /*ElementAt*/
  25.  
  26. bool InitGraph(int numberOfNodes){
  27. int row, col;
  28. NrOfNodes = numberOfNodes;
  29. /* allocate memory for aMatrix[NrOfNodes][NrOfNodes] */
  30. aMatrix = (int*)malloc(sizeof(int) * NrOfNodes * NrOfNodes);
  31. if (aMatrix == NULL)
  32. return false;
  33. for(row = 0; row < NrOfNodes; row++){
  34. for(col = 0; col < NrOfNodes; col++){
  35. SetElementAt(row, col, 0);
  36. } /*for*/
  37. } /*for*/
  38. return true;
  39. } /*InitGraph*/
  40.  
  41.  
  42. bool AddEdge(int fromNode, int toNode, int weight){
  43. /* convert "fromNode" and "toNode" to index of array */
  44. SetElementAt(fromNode-1, toNode-1, weight);
  45. return true;
  46. } /*AddEdge*/
  47.  
  48.  
  49. void RemoveEdge(int fromNode, int toNode){
  50. /* convert "fromNode" and "toNode" to index of array */
  51. SetElementAt(fromNode-1, toNode-1, 0);
  52. return;
  53. } /*RemoveEdge*/
  54.  
  55.  
  56. void PrintGraph(){
  57. int row, col;
  58. int valCache;
  59. printf("Graph:\n ");
  60. for (col = 0; col < NrOfNodes; col++)
  61. printf("%2d ", col+1);
  62. printf("\n +");
  63. for (col = 0; col < NrOfNodes; col++)
  64. printf("---");
  65. printf("\n");
  66. for (row = 0; row < NrOfNodes; row++) {
  67. printf ("%2d|", row+1);
  68. for (col = 0; col < NrOfNodes; col++) {
  69. valCache = GetElementAt(row, col);
  70. if (valCache == INT_MIN)
  71. printf(" ? ");
  72. else if (valCache == 0)
  73. printf(" - ");
  74. else
  75. printf("%2d ", valCache);
  76.  
  77. } /*for*/
  78. printf("\n");
  79. } /*for*/
  80. printf("\n");
  81. return;
  82. } /*PrintGraph*/
  83.  
  84.  
  85. void ForEachNode(NodeHandler hdlr) {
  86. int node;
  87. for (node = 0; node < NrOfNodes; node++){
  88. (*hdlr)(node+1);
  89. } /*for*/
  90. return;
  91. } /*ForEachNode*/
  92.  
  93.  
  94. void ForEachEdge(EdgeHandler hdlr) {
  95. int fromNode;
  96. int toNode;
  97. int weightCache;
  98. for (fromNode = 0; fromNode < NrOfNodes; fromNode++){
  99. for(toNode = 0; toNode < NrOfNodes; toNode++){
  100. weightCache = GetElementAt(fromNode, toNode);
  101. if (weightCache != 0)
  102. (*hdlr)(fromNode+1, toNode+1, weightCache);
  103. } /*for*/
  104. } /*for*/
  105. return;
  106. } /*ForEachEdge*/
  107.  
  108.  
  109. void DestroyGraph(){
  110. free(aMatrix);
  111. return;
  112. } /*DestroyGraph*/
  113.  
  114.  
  115. void PrintFWMatrix(){
  116. int *fwMatrix; /* =fwMatrix[NrOfNodes][NrOfNodes] */
  117. int i, j, k;
  118. int valCache;
  119. int hugeNumber = 9999;
  120.  
  121. int FWGetElementAt(int row, int col){
  122. return *((int*)fwMatrix + (NrOfNodes * row) + col);
  123. } /*FWGetElementAt*/
  124.  
  125. void FWSetElementAt(int row, int col, int value){
  126. *((int*)fwMatrix + (NrOfNodes * row) + col) = value;
  127. return;
  128. } /*FWGetElementAt*/
  129.  
  130. void FWPrintGraph(){
  131. int row, col;
  132. int valCache;
  133. printf("Shortest ways:\n ");
  134. for (col = 0; col < NrOfNodes; col++)
  135. printf("%2d ", col+1);
  136. printf("\n +");
  137. for (col = 0; col < NrOfNodes; col++)
  138. printf("---");
  139. printf("\n");
  140. for (row = 0; row < NrOfNodes; row++) {
  141. printf ("%2d|", row+1);
  142. for (col = 0; col < NrOfNodes; col++) {
  143. valCache = FWGetElementAt(row, col);
  144. if (valCache == hugeNumber)
  145. printf(" - ");
  146. else
  147. printf("%2d ", valCache);
  148. } /*for*/
  149. printf("\n");
  150. } /*for*/
  151. printf("\n");
  152. return;
  153. } /*FWPrintGraph*/
  154.  
  155. int Min(int value1, int value2){
  156. if (value1 < value2)
  157. return value1;
  158. else
  159. return value2;
  160. } /*Min*/
  161.  
  162. /*allocate memory*/
  163. fwMatrix = (int*)malloc(sizeof(int) * NrOfNodes * NrOfNodes);
  164. if (fwMatrix == NULL){
  165. printf("ERROR: Can't allocate memory\n");
  166. return;
  167. } /*if*/
  168.  
  169. /*copy aMatrix to fwMatrix*/
  170. for(i = 0; i < NrOfNodes; i++){
  171. for(j = 0; j < NrOfNodes; j++){
  172. valCache = GetElementAt(i, j);
  173. if ((valCache == INT_MIN) ||
  174. (valCache == 0)){
  175. /* if no weight is set, insert huge number */
  176. valCache = hugeNumber;
  177. } /*if*/
  178. FWSetElementAt(i, j, valCache);
  179. } /*for*/
  180. } /*for*/
  181.  
  182. /*calculate shortest ways (FW-Alogithm)*/
  183. for (k = 0; k < NrOfNodes; k++){
  184. for (i = 0; i < NrOfNodes; i++){
  185. for (j = 0; j < NrOfNodes; j++){
  186. valCache = Min(FWGetElementAt(i, j), FWGetElementAt(i,k) + FWGetElementAt(k,j));
  187. FWSetElementAt(i, j, valCache);
  188. } /*for j*/
  189. } /*for i*/
  190. } /*for k*/
  191.  
  192. /*print matrix*/
  193. FWPrintGraph();
  194.  
  195. /*free memory*/
  196. free(fwMatrix);
  197.  
  198. return;
  199. } /*PrintFWMatrix*/
Add Comment
Please, Sign In to add comment