void mst::prim(graph g) { int num = g.num_of_vertices(); minheap* candidates = new minheap(num); reset(); // find the starting point and initialize the heap int start_node = 0; while(candidates->size() == 0) { for(int i=0; i<num; ++i) { float c = g.cost(start_node, i); if (c != 0) candidates->update(c, i); } ++start_node; } closed_set.insert(start_node-1); while (candidates->size()!=0) { heapitem t = candidates->pop(); int node = t.get_node(); // not record the duplicated probed nodes if (closed_set.find(node)!=closed_set.end()) continue; closed_set.insert(node); path_cost += t.get_key(); vector<int> n = g.neighbors(node); // update the heap with newly found nodes and edges for(vector<int>::iterator i=n.begin(); i!=n.end(); ++i) { candidates->update(g.cost(node,*i), *i); } } // ckeck if there are isolated nodes if (closed_set.size() < num-1) path_cost=-1; }
void mst::kruskal(graph g) { int num = g.num_of_vertices(); vector< vector<float> > edges; union_find explored; reset(); // put all connected vertices in "edges" for(int i=0; i<num; ++i) { for(int j=0; j<num; ++j) { float c = g.cost(i, j); if (c!=0) { vector<float> temp; temp.push_back(i); temp.push_back(j); temp.push_back(c); edges.push_back(temp); } } } sort(edges.begin(), edges.end(), kruskal_compare); for(vector<vector<float> >::iterator p=edges.begin(); p!=edges.end(); ++p) { // both nodes in the closed set ==> detecting a cycle vector<float> temp = *p; int f1 = explored.find(temp[0]); int f2 = explored.find(temp[1]); if(f1!=-1 && f2!=-1 && f1==f2) continue; path_cost += temp[2]; explored.insert(temp[0], temp[1]); //cout <<"From "<<temp[0]<<" To "<<temp[1]<<" -- Cost "<<temp[2]<<endl; } // ckeck if there are isolated nodes if (explored.num_of_unions() != 1) path_cost=-1; }
// calculate the path using dijkstra's algo. void dijkstra::path(graph g, int u, int v) { int num = g.num_of_vertices(); minheap* candidates = new minheap(num); // reset the path_cost and clear the closed_set reset(); // initialize the heap // the nodes in the heap are those of "open set" for (int i=0; i<num; ++i) { float c = g.cost(u, i); if (c!=0) candidates->update(c, i); } while (candidates->size()!=0) { heapitem t = candidates->pop(); int node = t.get_node(); // not record the duplicated probed nodes if (closed_set.find(node)!=closed_set.end()) continue; closed_set.insert(node); path_cost = t.get_key(); // terminated if arrives at the destination if (node == v) return; vector<int> n = g.neighbors(node); // update the heap with newly found nodes for(vector<int>::iterator i=n.begin(); i!=n.end(); ++i) { candidates->update(path_cost+g.cost(node,*i), *i); } } // after iteration, the v is not found path_cost = -1; }