CS3343/3341 Analysis of Algorithms Spring 2012 |
Breadth-first Search in C
|
Breadth-first Search in C | |
---|---|
#include <stdio.h> #include <stdlib.h> #include "queue.h" #define GRAPHSIZE 48 struct graphnode { struct edgenode* firstedgenode; // other vertex info here int color; // 0, 1, 2 = white, gray, black int d; // shortest dist to node in edges int pi; // predessesor }; struct edgenode { int vertexnum; int edgedist; struct edgenode* nextedgenode; // other edge info here }; void printgraph(struct graphnode* graph[], int); struct graphnode* newgraphnode(); struct edgenode* newedgenode(int , struct edgenode* , int ); void breadthsearch(struct graphnode* graph[], int ); void insert(struct graphnode* [], int, int, int); int main() { struct graphnode* graph[GRAPHSIZE]; int i; int num1, num2, num; for(i = 0; i < GRAPHSIZE; i++) graph[i] = NULL; FILE *infile; infile = fopen("capsdistnum.txt", "r"); if (infile == NULL) { fprintf(stderr, "Can't open %s\n", "source.txt"); exit(1); } while (fscanf(infile, "%i %i %i", &num1, &num2, &num) != EOF) { insert(graph, num1, num2, num); insert(graph, num2, num1, num); } // printgraph(graph, GRAPHSIZE); breadthsearch(graph, 3); // WA } struct graphnode* newgraphnode(){ struct graphnode* nnode = malloc(sizeof(struct graphnode)); nnode -> firstedgenode = NULL; nnode -> color = 0; // white nnode -> d = 100000000; nnode -> pi = -1; return nnode; } struct edgenode* newedgenode(int num, struct edgenode* node, int dist) { struct edgenode* nnode = malloc(sizeof(struct edgenode)); nnode -> vertexnum = num; nnode -> nextedgenode = node; nnode -> edgedist = dist; return nnode; } void insert(struct graphnode* graph[], int num1, int num2, int dist){ struct graphnode* node = graph[num1]; if (node == NULL) { struct graphnode* gnode = newgraphnode(); graph[num1] = gnode; struct edgenode* enode = newedgenode(num2, NULL, dist); graph[num1] -> firstedgenode = enode; } else { struct edgenode* enode = newedgenode(num2, graph[num1] -> firstedgenode, dist); graph[num1] -> firstedgenode = enode; } } void printgraph(struct graphnode* graph[], int count) { int i; for (i = 0; i < GRAPHSIZE; i++) { printf("%2i: ", i); struct edgenode* node = graph[i] -> firstedgenode; while (node != NULL) { printf("[%2i,%3i]", node -> vertexnum, node -> edgedist); node = node -> nextedgenode; if (node != NULL) printf(","); else printf("\n"); } } } void breadthsearch(struct graphnode* graph[], int s) { int u, v; // vertices used in loop graph[s] -> color = 1; // gray graph[s] -> d = 0; graph[s] -> pi = -1; enqueue(s); while (!isempty()) { u = dequeue(); struct edgenode* vnode = graph[u] -> firstedgenode; v = vnode -> vertexnum; while(1) { if (graph[v] -> color == 0) { // white graph[v] -> color = 1; // gray graph[v] -> d = graph[u] -> d + 1; graph[v] -> pi = u; enqueue(v); } vnode = vnode -> nextedgenode; if (vnode == NULL) break; else v = vnode -> vertexnum; } graph[u] -> color = 2; // black } int i; for (i = 0; i < GRAPHSIZE; i++) { if (i < 10) printf(" "); printf("%i: color:%i, d:%i, pi:%i\tEdge: (%i,%i)\n", i, graph[i] -> color, graph[i] -> d, graph[i] -> pi, graph[i] -> pi, i); } } | // queue.h: header file int dequeue(); void enqueue(int ); int isempty(); int isfull(); int getfront(); void dumpq(); | Output |
0: color:2, d:2, pi:2 Edge: (2,0) 1: color:2, d:2, pi:6 Edge: (6,1) 2: color:2, d:1, pi:3 Edge: (3,2) 3: color:2, d:0, pi:-1 Edge: (-1,3) 4: color:2, d:3, pi:5 Edge: (5,4) 5: color:2, d:2, pi:6 Edge: (6,5) 6: color:2, d:1, pi:3 Edge: (3,6) 7: color:2, d:4, pi:8 Edge: (8,7) 8: color:2, d:3, pi:9 Edge: (9,8) 9: color:2, d:2, pi:6 Edge: (6,9) 10: color:2, d:2, pi:6 Edge: (6,10) 11: color:2, d:5, pi:12 Edge: (12,11) 12: color:2, d:4, pi:8 Edge: (8,12) 13: color:2, d:4, pi:14 Edge: (14,13) 14: color:2, d:3, pi:9 Edge: (9,14) 15: color:2, d:3, pi:10 Edge: (10,15) 16: color:2, d:3, pi:10 Edge: (10,16) 17: color:2, d:6, pi:18 Edge: (18,17) 18: color:2, d:5, pi:19 Edge: (19,18) 19: color:2, d:4, pi:14 Edge: (14,19) 20: color:2, d:4, pi:15 Edge: (15,20) 21: color:2, d:4, pi:16 Edge: (16,21) 22: color:2, d:6, pi:26 Edge: (26,22) 23: color:2, d:5, pi:20 Edge: (20,23) | 24: color:2, d:5, pi:21 Edge: (21,24) 25: color:2, d:6, pi:26 Edge: (26,25) 26: color:2, d:5, pi:19 Edge: (19,26) 27: color:2, d:5, pi:19 Edge: (19,27) 28: color:2, d:6, pi:23 Edge: (23,28) 29: color:2, d:6, pi:24 Edge: (24,29) 30: color:2, d:7, pi:31 Edge: (31,30) 31: color:2, d:6, pi:26 Edge: (26,31) 32: color:2, d:6, pi:27 Edge: (27,32) 33: color:2, d:6, pi:27 Edge: (27,33) 34: color:2, d:6, pi:27 Edge: (27,34) 35: color:2, d:7, pi:36 Edge: (36,35) 36: color:2, d:6, pi:26 Edge: (26,36) 37: color:2, d:7, pi:33 Edge: (33,37) 38: color:2, d:7, pi:34 Edge: (34,38) 39: color:2, d:8, pi:38 Edge: (38,39) 40: color:2, d:8, pi:38 Edge: (38,40) 41: color:2, d:8, pi:38 Edge: (38,41) 42: color:2, d:9, pi:41 Edge: (41,42) 43: color:2, d:9, pi:41 Edge: (41,43) 44: color:2, d:9, pi:41 Edge: (41,44) 45: color:2, d:10,pi:42 Edge: (42,45) 46: color:2, d:10,pi:44 Edge: (44,46) 47: color:2, d:11,pi:45 Edge: (45,47) |