00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "bfs.h"
00027 #include <stdlib.h>
00028
00029
00030 void bfs(int vertex, vtx_data * graph, int n, DistType * dist, Queue * Q)
00031
00032 {
00033 int i;
00034 int closestVertex, neighbor;
00035 DistType closestDist = INT_MAX;
00036
00037
00038 for (i = 0; i < n; i++)
00039 dist[i] = -1;
00040 dist[vertex] = 0;
00041
00042 initQueue(Q, vertex);
00043
00044 if (graph[0].ewgts == NULL) {
00045 while (deQueue(Q, &closestVertex)) {
00046 closestDist = dist[closestVertex];
00047 for (i = 1; i < graph[closestVertex].nedges; i++) {
00048 neighbor = graph[closestVertex].edges[i];
00049 if (dist[neighbor] < -0.5) {
00050 dist[neighbor] = closestDist + 1;
00051 enQueue(Q, neighbor);
00052 }
00053 }
00054 }
00055 } else {
00056 while (deQueue(Q, &closestVertex)) {
00057 closestDist = dist[closestVertex];
00058 for (i = 1; i < graph[closestVertex].nedges; i++) {
00059 neighbor = graph[closestVertex].edges[i];
00060 if (dist[neighbor] < -0.5) {
00061 dist[neighbor] =
00062 closestDist +
00063 (DistType) graph[closestVertex].ewgts[i];
00064 enQueue(Q, neighbor);
00065 }
00066 }
00067 }
00068 }
00069
00070
00071 for (i = 0; i < n; i++)
00072 if (dist[i] < -0.5)
00073 dist[i] = closestDist + 10;
00074 }
00075
00076 int
00077 bfs_bounded(int vertex, vtx_data * graph, int n, DistType * dist,
00078 Queue * Q, int bound, int *visited_nodes)
00079
00080
00081 {
00082
00083
00084 int i;
00085 int num_visit;
00086 int closestVertex, neighbor;
00087 DistType closestDist;
00088
00089
00090
00091
00092 dist[vertex] = 0;
00093
00094 initQueue(Q, vertex);
00095
00096 num_visit = 0;
00097 while (deQueue(Q, &closestVertex)) {
00098 closestDist = dist[closestVertex];
00099 if (closestDist > bound) {
00100 dist[closestVertex] = -1;
00101 break;
00102 } else {
00103 visited_nodes[num_visit++] = closestVertex;
00104 }
00105 for (i = 1; i < graph[closestVertex].nedges; i++) {
00106 neighbor = graph[closestVertex].edges[i];
00107 if (dist[neighbor] < -0.5) {
00108 dist[neighbor] = closestDist + 1;
00109 enQueue(Q, neighbor);
00110 }
00111 }
00112 }
00113
00114
00115
00116 while (deQueue(Q, &closestVertex)) {
00117 dist[closestVertex] = -1;
00118 }
00119 dist[vertex] = -1;
00120 return num_visit;
00121 }
00122
00123 #ifndef __cplusplus
00124
00125 void mkQueue(Queue * qp, int size)
00126 {
00127 qp->data = N_GNEW(size, int);
00128 qp->queueSize = size;
00129 qp->start = qp->end = 0;
00130 }
00131
00132 Queue *newQueue(int size)
00133 {
00134 Queue *qp = GNEW(Queue);
00135 mkQueue(qp, size);
00136 return qp;
00137 }
00138
00139 void freeQueue(Queue * qp)
00140 {
00141 free(qp->data);
00142 }
00143
00144 void delQueue(Queue * qp)
00145 {
00146 free(qp->data);
00147 free(qp);
00148 }
00149
00150 void initQueue(Queue * qp, int startVertex)
00151 {
00152 qp->data[0] = startVertex;
00153 qp->start = 0;
00154 qp->end = 1;
00155 }
00156
00157 boolean deQueue(Queue * qp, int *vertex)
00158 {
00159 if (qp->start >= qp->end)
00160 return FALSE;
00161 *vertex = qp->data[qp->start++];
00162 return TRUE;
00163 }
00164
00165 boolean enQueue(Queue * qp, int vertex)
00166 {
00167 if (qp->end >= qp->queueSize)
00168 return FALSE;
00169 qp->data[qp->end++] = vertex;
00170 return TRUE;
00171 }
00172
00173 #endif