Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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;
}