Dijkstra算法在C ++中的双向实现

时间:2014-02-04 19:28:51

标签: c++ algorithm dijkstra bidirectional adjacency-matrix

我最近刚开始学习c ++,为了完成下一个作业,我必须实现dijkstra算法的双向版本。我应该建立在我最后一个使用向量制作图形的任务上。我想知道使用我的代码设置此任务的最佳方法是什么。这是实际的任务:


机器问题3:双向最短路径算法:Ira Pohl 2014年1月24日

目标:改进您的图表类并添加Dijkstra和双向算法

图形算法和图形表示是CS中的关键工具。基本问题是将Dijkstra算法编写为类成员函数(OO中的方法)。您应该已经知道Dijkstra的算法可以解决之前经验中的最短路径问题,但是会在课堂上进行审核。它是许多路线计算和优化计划的基础。

图表有两种基本实现 - 一种是边缘列表,另一种是连接矩阵。您可以决定使用哪个,但评论您的选择。

基本问题:编写一组构造函数来声明和初始化图形或使用先前的图形实现。边缘将具有正距离的成本。有一个程序可以为至少1000的图形产生一组随机生成的正距离边。假设图表是无向的。随机图程序应将边缘密度作为参数,距离范围作为参数。因此,密度为0.1的图形将随机选取其边缘的10%,并且将从距离范围随机选择其边缘距离。这当然已经在问题2中得到了发展。

Dijkstra双向算法应该重用Dijkstra单向算法中的代码。


#include <iostream>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <cmath>

double probability(){ return 1.0*rand()/RAND_MAX;}


using namespace std;
//class that has make_graph as constructor
class Graph{
   public:
      Graph(int s, double density);
      void print_graph();
   private:
      int size;
      vector<vector<bool> > g1; //A vector of vectors of bools
      //Think of a vector as a first in, last out Data Structure
};


//make_graph altered to work in c++
Graph::Graph(int s, double density){
   this->size = s;
   for (int i = 0; i < s; ++i){
        // We push a new vector of bool onto the initial vector s times
        // The * is there to dereference the new vector that we insert
        this->g1.push_back( *( new vector<bool>() ) );
        for (int j = 0; j < s; ++j){
            //then, on each of those vectors, we push a default "false" s times
            this->g1.at(i).push_back(false);
        }
   }
   //Don't have to change this part much
   for (int i = 0; i < s; ++i){
      for (int j = 0; j < s; ++j){
        if (probability()< density) this->g1[i][j] = true;
      }
   }
}

//simple conversion, just needed 'this'
void Graph::print_graph(){
cout << "graph size " << this->size << "\n";
   for(int i = 0; i < this->size; ++i){
      for (int j = 0; j < this->size; ++j){
         cout << this->g1[i][j] << "\t";
      }
      cout << "\n";
   }
}

int main(){
    srand(time(0));
    cout << "Test simple graph generation\n";
    Graph* test1 = new Graph(10, 0.7);
    test1->print_graph();
    cout << "\nEND of TEST 1\n\n";
    Graph* test2 = new Graph(8, 0.5);
    test2->print_graph();
    cout << "\nEND of TEST 2\n\n";
    return 0;
}

0 个答案:

没有答案