⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dijkstra.cpp

📁 个人完成的dijkstra algorithm例程.直接读取文本文件并完成计算.设置为最大可读512点.
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
const int infinity = 10000;
class dijkstra
{
      private:
              int graph[512][512];// build an empty matrix 
              int set[512],predecessor[512],mark[512],pathestimate[512];
              int source;
              int verticesNum;
      public:
             int minimum();
             void read();
             void initialize();
             void printpath(int);
             void algorithm();
             void output();
};
void dijkstra::read()
{
     string filename;
     ifstream infile;
     cout<<"Please input a file name:";
     cin>>filename;
     infile.open(filename.c_str());
     if (infile.fail()){
                        cout<<" invalid file!"<<endl;
     }
     else 
     {
         infile >> verticesNum;//get the num of vertices 
         //build an adjacent matrix
         for(int i=1;i<=verticesNum;i++)
         {
                 for(int j=1;j<=verticesNum;j++)
                 {
                         infile >> graph[i][j];
                 }
         }
         //select the source vertex;
         infile>>source;
         infile.close();        
     }
}

void dijkstra::initialize()
{
    for(int i=1;i<=verticesNum;i++)
    {
      mark[i] = 0;
      pathestimate[i] = infinity;
      predecessor[i] = 0;
    }
    pathestimate[source] = 0;
}
void dijkstra::algorithm()
{
    initialize();
    int count = 1;
    int i;
    int j;
    while(count <= verticesNum)
    {
        j = minimum();
        set[++count] = j;
        mark[j] = 1;
        for(i=1;i<=verticesNum;i++)
        {
          if(graph[j][i]>0)
          {
              if(mark[i]!= 1)
              {
                        if(pathestimate[i]>pathestimate[j]+graph[j][i])
                        {
                              pathestimate[i] = pathestimate[j]+graph[j][i];
                              predecessor[i] = j;
                        }
              }
          }
        }
    }
}

void dijkstra::printpath(int i)
{
     if(i != source)
     {
          if(predecessor[i]==0){
                    cout<<"-1"<<" ";
          }
          else
          {
              printpath(predecessor[i]);
          }
     }
}

void dijkstra::output()
{

     for(int i=1;i<=verticesNum;i++)
     {
             printpath(i);
             if(pathestimate[i]!= infinity)
             cout<<pathestimate[i]<<" ";
     }
     cout<<endl;
}
int dijkstra::minimum()
{
  int min = infinity;
  int i,t;
  for(i=1;i<=verticesNum;i++)
  {
    if(mark[i]!=1)
    {
      if(min>=pathestimate[i])
      {
                min=pathestimate[i];
                t=i;
      }
    }
      
  }
  return t;
}
int main()
{
    dijkstra s;
    s.read();
    s.algorithm();
    s.output();
    system ("pause");
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -