int main(int argc, char *argv[]) { int graprevhic[num][num]; for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { if (i == j) graprevhic[i][j] = 0; else graprevhic[i][j] = Infinity; } } graprevhic[0][1] = 1; graprevhic[0][2] = 5; graprevhic[1][0] = 1; graprevhic[1][2] = 3; graprevhic[1][3] = 7; graprevhic[1][4] = 5; graprevhic[2][0] = 5; graprevhic[2][1] = 3; graprevhic[2][4] = 1; graprevhic[2][5] = 7; graprevhic[3][1] = 7; graprevhic[3][4] = 2; graprevhic[3][6] = 3; graprevhic[4][1] = 5; graprevhic[4][2] = 1; graprevhic[4][3] = 2; graprevhic[4][5] = 3; graprevhic[4][6] = 6; graprevhic[4][7] = 9; graprevhic[5][2] = 7; graprevhic[5][4] = 3; graprevhic[5][7] = 5; graprevhic[6][3] = 3; graprevhic[6][4] = 6; graprevhic[6][7] = 2; graprevhic[6][8] = 7; graprevhic[7][4] = 9; graprevhic[7][5] = 5; graprevhic[7][6] = 2; graprevhic[7][8] = 4; graprevhic[8][6] = 7; graprevhic[8][7] = 4; int distance[num]; int prev[num]; dijk(distance, prev, graprevhic, 2); for (int i = 0; i < num; i++) { cout << distance[i] << endl; } return 0; }
int main() { int i,j,v,k,w; printf("enter the number of vertices and edges\n\n"); scanf("%d%d",&n,&k); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) cs[i][j]=0; else cs[i][j]=999; for(i=1;i<=k;i++) { printf("enter the edges and vertices\n"); scanf("%d%d%d",&j,&v,&w); cs[j][v]=w; } printf("enter the starting vertex\n"); scanf("%d",&i); dijk(i); return 0; }
int Steiner::steiner(const set<ListGraph::Node> terminals) { if (this->s != 0) delete this->s; this->s = new ListGraph(); if (this->sweight != 0) delete this->sweight; this->sweight = new ListGraph::EdgeMap<int>(*this->s); // perform dijkstra for every terminal ListGraph::NodeMap<Dijkstra*> dijk(this->g); for (set<ListGraph::Node>::iterator it = terminals.begin(); it != terminals.end(); ++it) { dijk[*it] = new Dijkstra(this->g, this->weight); dijk[*it]->dijkstra(*it); } // build intermediate graph ListGraph intermediate; ListGraph::EdgeMap<int> iweight(intermediate); map<ListGraph::Node, ListGraph::Node> imapper; for (set<ListGraph::Node>::iterator it = terminals.begin(); it != terminals.end(); ++it) { ListGraph::Node n = intermediate.addNode(); imapper[n] = *it; } for (ListGraph::NodeIt it1(intermediate); it1 != INVALID; ++it1) { ListGraph::NodeIt it2 = it1; for (++it2; it2 != INVALID; ++it2) { ListGraph::Edge e = intermediate.addEdge(it1, it2); iweight[e] = (*dijk[imapper[it1]]->dist)[imapper[it2]]; } } // compute mst MST mst(intermediate, iweight); mst.prim(); // Kruskal mst(intermediate, iweight); // mst.kruskal(); // build final graph map<ListGraph::Node, ListGraph::Node> smapper; for (set<ListGraph::Edge>::iterator it = mst.mst->begin(); it != mst.mst->end(); ++it) { // for each edge in the mst // add end nodes to graph ListGraph::Node u = imapper[intermediate.u(*it)]; if (smapper.count(u) == 0) smapper[u] = this->s->addNode(); ListGraph::Node v = imapper[intermediate.v(*it)]; if (smapper.count(v) == 0) smapper[v] = this->s->addNode(); ListGraph::Node last = v; ListGraph::Node cur = v; do { // walk through path cur = (*dijk[u]->pred)[cur]; if (smapper.count(cur) == 0) smapper[cur] = this->s->addNode(); // add edge to graph, if not already existing if (findEdge(*this->s, smapper[last], smapper[cur]) == INVALID) { ListGraph::Edge e = this->s->addEdge(smapper[last], smapper[cur]); (*this->sweight)[e] = (*dijk[u]->dist)[last] - (*dijk[u]->dist)[cur]; } last = cur; } while (cur != u); } // compute overall weight int overallw = 0; for (ListGraph::EdgeIt e(*this->s); e != INVALID; ++e) { overallw += (*this->sweight)[e]; } // clean up dijkstras for (set<ListGraph::Node>::iterator it = terminals.begin(); it != terminals.end(); ++it) { delete dijk[*it]; } return overallw; }