Advertisement
BlueBear

3_1.c

Nov 12th, 2013
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct edge
  5. {
  6. struct edge *next;
  7. struct vertex *vertex;
  8. int distance;
  9. } t_edge;
  10.  
  11. typedef struct vertex
  12. {
  13. t_edge* first;
  14. t_edge* last;
  15. int value;
  16. } t_vert;
  17.  
  18. t_vert* createVertex(int value)
  19. {
  20. t_vert* new = malloc(sizeof(t_vert));
  21. new->first = NULL;
  22. new->last = NULL;
  23. new->value = value;
  24. return new;
  25. }
  26.  
  27. int isempty(t_vert *vertex)
  28. {
  29. if(!vertex->first) return 1;
  30. return 0;
  31. }
  32.  
  33. int equals(t_vert *vertexA, t_vert *vertexB)
  34. {
  35. if(vertexA->value == vertexB->value) return 1;
  36. return 0;
  37. }
  38.  
  39.  
  40. void createedge(t_vert* vertexA, t_vert* vertexB, int distance)
  41. {
  42. t_edge* edgeAB = malloc(sizeof(t_edge));
  43. edgeAB->vertex = vertexB;
  44. edgeAB->distance = distance;
  45.  
  46. t_edge* edgeBA = malloc(sizeof(t_edge));
  47. edgeBA->vertex = vertexA;
  48. edgeBA->distance = distance;
  49.  
  50. if(vertexA->first)
  51. {
  52. vertexA->last->next = edgeAB;
  53. vertexA->last = edgeAB;
  54. }
  55. else
  56. {
  57. vertexA->first = vertexA->last = edgeAB;
  58. }
  59.  
  60. if(vertexB->first)
  61. {
  62. vertexB->last->next = edgeBA;
  63. vertexB->last = edgeBA;
  64. }
  65. else
  66. {
  67. vertexB->first = vertexB->last = edgeBA;
  68. }
  69. }
  70.  
  71. int path(t_vert* before, t_vert *actual, t_vert *target)
  72. {
  73. if(equals(actual, target))
  74. {
  75. return 0;
  76. }
  77. if(!isempty(actual))
  78. {
  79. while(actual->first)
  80. {
  81. if(!equals(before, actual->first->vertex))
  82. {
  83. int val = path(actual, actual->first->vertex, target);
  84. if(val != -1)
  85. {
  86. return actual->first->distance + val;
  87. }
  88. }
  89. actual->first = actual->first->next;
  90. }
  91. }
  92. return -1;
  93. }
  94.  
  95. int main()
  96. {
  97. int edgeCount, vertexCount, start, destination;
  98. int i;
  99. int temp;
  100. scanf("%d %d %d %d", &vertexCount, &edgeCount, &start, &destination);
  101.  
  102. if(start > destination)
  103. {
  104. temp = destination;
  105. destination = start;
  106. start = temp;
  107. }
  108. t_vert **vertices;
  109.  
  110. vertices = (t_vert **)malloc(sizeof(t_vert *) * vertexCount);
  111. for(i = 0; i < vertexCount; i++)
  112. {
  113. vertices[i] = createVertex(i);
  114. }
  115.  
  116. for(i = 0; i < edgeCount; i++)
  117. {
  118. int vertexA, vertexB, length;
  119. scanf("%d %d %d", &vertexA, &vertexB, &length);
  120. createedge(vertices[vertexA-1], vertices[vertexB-1], length);
  121. }
  122.  
  123. printf("%d\n", path(vertices[start-1], vertices[start-1], vertices[destination-1]));
  124.  
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement