Advertisement
Guest User

805 - Busca em Largura

a guest
Oct 26th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.19 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* Structs */
  5. typedef struct adj_list Adjlist;
  6. struct adj_list {
  7. int item;
  8. Adjlist *next;
  9. };
  10.  
  11. typedef struct graph Graph;
  12. struct graph {
  13. Adjlist **vertices;
  14. short *visited;
  15. int *distance;
  16. int *previous;
  17. int size;
  18. };
  19.  
  20. typedef struct node Node;
  21. struct node {
  22. int item;
  23. Node* next_node;
  24. };
  25.  
  26. typedef struct queue Queue;
  27. struct queue {
  28. Node *first;
  29. Node *rear;
  30. };
  31.  
  32. /* Utils */
  33. void free_adj_list(Adjlist *node) {
  34. if(node == NULL) return;
  35.  
  36. free_adj_list(node->next);
  37.  
  38. free(node);
  39. }
  40.  
  41. void free_graph(Graph *graph) {
  42. int i;
  43.  
  44. for(i = 0; i < graph->size; ++i) {
  45. free_adj_list(graph->vertices[i]);
  46. }
  47.  
  48. free(graph);
  49. }
  50.  
  51. /* List functions */
  52. void sort_list(Adjlist* list) {
  53. Adjlist* node_aux;
  54. Adjlist* node;
  55.  
  56. for(node_aux = list; node_aux->next != NULL; node_aux = node_aux->next) {
  57. for(node = list; node->next != NULL; node = node->next) {
  58. if(node->item > node->next->item) {
  59. char item_aux = node->item;
  60. node->item = node->next->item;
  61. node->next->item = item_aux;
  62. }
  63. }
  64. }
  65. }
  66.  
  67. /* Queue functions */
  68. Queue* create_queue() {
  69. Queue *queue = (Queue*) malloc(sizeof(Queue));
  70. queue->first = NULL;
  71. queue->rear = NULL;
  72.  
  73. return queue;
  74. }
  75.  
  76. void enqueue(Queue *queue, int item) {
  77. Node *new_node = (Node*) malloc(sizeof(Node));
  78. new_node->item = item;
  79. new_node->next_node = NULL;
  80.  
  81. if(queue->rear == NULL) {
  82. queue->first = queue->rear = new_node;
  83. } else {
  84. queue->rear->next_node = new_node;
  85. queue->rear = new_node;
  86. }
  87. }
  88.  
  89. int dequeue(Queue *queue) {
  90. int dequeued_item;
  91. if(queue->first == NULL) {
  92. return -1;
  93. } else {
  94. dequeued_item = queue->first->item;
  95. }
  96.  
  97.  
  98. Node* dequeued = queue->first;
  99. queue->first = queue->first->next_node;
  100.  
  101. if(queue->first == NULL && queue->rear != NULL) queue->rear = NULL;
  102.  
  103. free(dequeued);
  104. return dequeued_item;
  105. }
  106.  
  107. /* Graph functions */
  108. Graph* create_graph(int size) {
  109. Graph *graph = malloc(sizeof(Graph));
  110.  
  111. graph->size = size;
  112. graph->vertices = malloc(size * sizeof(Adjlist *));
  113. graph->visited = malloc(size * sizeof(short));
  114. graph->distance = malloc(size * sizeof(int));
  115. graph->previous = malloc(size * sizeof(int));
  116.  
  117. int i;
  118. for(i = 0; i < size; ++i) {
  119. graph->vertices[i] = NULL;
  120. graph->visited[i] = 0;
  121. graph->distance[i] = 0;
  122. graph->previous[i] = -1;
  123. }
  124.  
  125. return graph;
  126. }
  127.  
  128. Adjlist* create_adjlist(int item) {
  129. Adjlist *adjlist = (Adjlist*) malloc(sizeof(Adjlist));
  130. adjlist->item = item;
  131. adjlist->next = NULL;
  132.  
  133. return adjlist;
  134. }
  135.  
  136. void add_edge(Graph *graph, int orig, int dest) {
  137. Adjlist *vertex = create_adjlist(dest);
  138. vertex->next = graph->vertices[orig];
  139. graph->vertices[orig] = vertex;
  140. }
  141.  
  142. void reset_graph(Graph *graph) {
  143. int i;
  144.  
  145. for(i = 0; i < graph->size; ++i) {
  146. graph->distance[i] = 0;
  147. graph->previous[i] = -1;
  148. graph->visited[i] = 0;
  149. }
  150. }
  151.  
  152. void print_path(Graph *graph, int i, int orig) {
  153. if(i == orig) return;
  154.  
  155. print_path(graph, graph->previous[i], orig);
  156.  
  157. printf("%d => ", i);
  158. }
  159.  
  160. void print_graph(Graph *graph, int orig, int dest) {
  161. int i;
  162.  
  163. printf("\n");
  164. for(i = 0; i < graph->size; ++i) {
  165. printf("%d", i);
  166.  
  167. if(graph->distance[i] == 0 && i != orig) printf(" | - | ");
  168. else printf(" | %d | ", graph->distance[i]);
  169.  
  170. if(graph->previous[i] == -1) printf("-\n");
  171. else printf("%d\n", graph->previous[i]);
  172. }
  173.  
  174. if(graph->distance[dest] == 0) {
  175. printf("\nSem caminho entre %d e %d\n", orig, dest);
  176. } else {
  177. printf("\nCaminho entre %d e %d: %d => ", orig, dest, orig);
  178. print_path(graph, graph->previous[dest], orig);
  179. printf("%d\n", dest);
  180. }
  181.  
  182. printf("\n");
  183. }
  184.  
  185. void bfs(Graph *graph, int orig, int dest) {
  186. Queue *queue = create_queue();
  187. int dequeued;
  188.  
  189. Adjlist *adjlist = graph->vertices[orig];
  190. graph->visited[orig] = 1;
  191. enqueue(queue, orig);
  192.  
  193. while(queue->first != NULL) {
  194. dequeued = dequeue(queue);
  195. printf("Iniciando busca em largura a partir de %d\n", dequeued);
  196. adjlist = graph->vertices[dequeued];
  197.  
  198. while(adjlist != NULL) {
  199. if (!graph->visited[adjlist->item]) {
  200. enqueue(queue, adjlist->item);
  201. graph->visited[adjlist->item] = 1;
  202. graph->previous[adjlist->item] = dequeued;
  203. graph->distance[adjlist->item] = graph->distance[dequeued] + 1;
  204. }
  205.  
  206. adjlist = adjlist->next;
  207. }
  208. }
  209.  
  210. graph->previous[orig] = -1;
  211.  
  212. free(queue);
  213. }
  214.  
  215. void sort_graph(Graph *graph) {
  216. int i;
  217.  
  218. for(i = 0; i < graph->size; ++i) {
  219. if(graph->vertices[i] != NULL) sort_list(graph->vertices[i]);
  220. }
  221. }
  222.  
  223. int main() {
  224. int v, a, t;
  225. int o, d;
  226. int i;
  227.  
  228. scanf("%d %d %d", &v, &a, &t);
  229. Graph *graph = create_graph(v);
  230.  
  231. for(i = 0; i < a; ++i) {
  232. scanf("%d %d", &o, &d);
  233.  
  234. add_edge(graph, o, d);
  235. }
  236.  
  237. sort_graph(graph);
  238.  
  239. for(i = 1; i <= t; ++i) {
  240. scanf("%d %d", &o, &d);
  241.  
  242. printf("--------\n\n");
  243. printf("Caso de Teste #%d - BFS(%d)\n\n", i, o);
  244. bfs(graph, o, d);
  245. print_graph(graph, o, d);
  246.  
  247. reset_graph(graph);
  248. }
  249.  
  250. printf("--------");
  251.  
  252. free_graph(graph);
  253.  
  254. return 0;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement