/**********************************************************/ /************** EDGELIST HEAP CLASS ***********************/ /**********************************************************/ // define the contents of an edge, // used for building edgelists // (for use in spanning tree algorithms) struct edgenode { int src; int dest; float weight; }; // define a heap, used to store edges with // the minimum weight edge on top class heap { private: int maxsize; int cursize; edgenode* *edges; public: heap(int sz = 0); ~heap() { delete edges; } bool insert(edgenode *e); edgenode *remove(); }; edgenode *heap::remove() { if ((cursize >= maxsize) || (!edges)) return NULL; edgenode *victim = edges[0]; edges[0] = edges[--cursize]; edgenode *e = edges[0]; if (!e) return NULL; edges[cursize] = NULL; int pos = 0; do { // see if e needs to swap with either of its children int left = 2 * pos + 1; int right = left + 1; // quit if there are no children if ((left >= cursize) || (edges[left] == NULL)) break; // check against a lone left child else if (left == (cursize-1)) { edgenode *tmp = edges[left]; if (tmp->weight < e->weight) { edges[left] = e; edges[pos] = tmp; pos = left; } else break; } // check against the larger of two children else { edgenode *l = edges[left]; edgenode *r = edges[right]; if (!l || !r) break; if ((l->weight > r->weight) && (l->weight > e->weight)) { edges[left] = e; edges[pos] = l; pos = left; } else if (r->weight > e->weight) { edges[right] = e; edges[pos] = r; pos = right; } else break; } } while (pos < cursize); return victim; } bool heap::insert(edgenode *e) { // make sure we have an edge to insert if (!e) return false; // insert the new edge edges[cursize++] = e; // percolate the edge up the heap int pos = cursize - 1; while (pos > 0) { // figure out the position of the parent int parent = (pos - 1) / 2; // if the parent is null there's an error // (there should be no nulls between // the heap root and the insert point) if (!edges[parent]) return false; // if the parent weight is no bigger than e's // then e is as far up the heap as it needs to go if (edges[parent]->weight <= e->weight) return true; // otherwise swap e and its parent edges[pos] = edges[parent]; edges[parent] = e; pos = parent; } return true; } heap::heap(int sz) { if (sz < 0) sz = 0; if (sz == 0) edges = NULL; else edges = new (edgenode*)[sz]; if (!edges) maxsize = 0; else maxsize = sz; cursize = 0; for (int i = 0; i < maxsize; i++) edges[i] = NULL; } |
/**********************************************************/ /************** MINIMAL SPANNING TREE FUNCTION ************/ /**********************************************************/ // if the graph has a minimal spanning tree, // display the list of edges in the tree // and return true // otherwise return false bool mst() { // initialize every node's spanning tree flag to false for (int i = 0; i < VERTICES; i++) { if (Graph[i] != NULL) { Graph[i]->inmst = false; } } // create a heap of edgelists, large enough to // store all the edges currently in the graph heap edgelist(get_numedges()); // find a starting node and mark it as in the mst int pos = 0; int cursize = get_graphsize(); while ((Graph[pos] == NULL) && (pos < cursize)) pos++; // if there were no nodes then the graph is empty if (pos >= cursize) return true; // use a queue of edgenodes to keep track of our mst deque |