zoukankan      html  css  js  c++  java
  • Dijkstra算法

    吐槽一句,这个东西好难拼

    迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 
    年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。——百度百科

    Dijkstra算法就是用来算在一个有向带权图中,一个点到其他各点的最短距离

    其思路是: 
    1.给起始点权值标成0,其他点标成无限大。从出发点开始 
    2.向该点向能通向的点走,算出到各点的总距离,并标记在相应点上。 
    3.给该点标记上访问标志,以后不再访问该点,然后从所有点中选出权值最小的点,重复步骤2 
    4.当所有点均被标记后,各点权值即为到该点最短距离

    代码 
    我觉得我写的好冗杂,不过注释应该能看懂的,理会意思即可

      1 #include <iostream>
      2 #include <set>
      3 #include <vector>
      4 #include <queue>
      5 using namespace std;
      6 
      7 
      8 class Dijkstra{
      9     private:
     10         const int INF=100000;
     11         struct Edge{//
     12             int to,weight;
     13         };
     14         struct Weight{//用于优先队列的比较
     15             int weight,n;
     16             bool operator < (const Weight& rhs)const{
     17                 return weight>rhs.weight;//权值越大,优先度越小
     18             }
     19         };
     20 
     21         struct Tree{//
     22             vector<vector<Edge> > node;
     23             vector<int> d;//到各个节点的最小值
     24             int N;//节点数目
     25 
     26             void init(int NodeNumber){//初始化
     27                 node.resize(NodeNumber);
     28                 d.resize(NodeNumber);
     29                 N=NodeNumber;
     30             }
     31 
     32             void Add(int from,int to,int weight){//添加边
     33                 node[from].push_back((Edge){to,weight});
     34             }
     35         };
     36         Tree T;
     37 
     38     public:
     39         void Add(int from,int to,int weight){
     40             T.Add(from,to,weight);
     41         }
     42         void init(int NodeNumber){
     43             T.init(NodeNumber);
     44         }
     45         void dijkstra(int v){//Dijkstra主算法
     46             vector<int>done;//访问标记
     47             done.resize(T.N);
     48             for(int i=0;i<T.d.size();i++){
     49                 T.d[i]=INF;
     50                 done[i]=0;
     51             }
     52             priority_queue <Weight> Q;//优先队列
     53             Q.push((Weight){0,v});//从第一个点开始
     54             T.d[v]=0;
     55 
     56             //BFS
     57             while(!Q.empty()){//只要队列不空就走下去
     58                 int u=Q.top().n;//获得优先度最高的节点
     59                 Q.pop();
     60                 if(done[u])continue;//如果已经访问过就跳过
     61                 done[u]=1;//访问标记
     62                 for(int i=0;i<T.node[u].size();i++){//该节点可以访问的节点
     63                     Edge& next=T.node[u][i];
     64                     if(T.d[u]+next.weight<T.d[next.to]){//如果距离更短,则更新
     65                         T.d[next.to]=T.d[u]+next.weight;
     66                         Q.push((Weight){next.weight,next.to});
     67                         //可以在这里加上一个vector,用来记录路径
     68                     }
     69                 }
     70             }
     71         }
     72         int get(int n){//返回到达指定节点的最短距离
     73             return T.d[n];
     74         }
     75 };
     76 
     77 int main(){
     78    Dijkstra D;
     79    D.init(6);
     80    D.Add(0,1,7);
     81    D.Add(0,2,9);
     82    D.Add(0,5,14);
     83    D.Add(1,0,7);
     84    D.Add(1,2,10);
     85    D.Add(1,3,15);
     86    D.Add(2,0,9);
     87    D.Add(2,1,10);
     88    D.Add(2,3,11);
     89    D.Add(2,5,2);
     90    D.Add(3,1,15);
     91    D.Add(3,2,11);
     92    D.Add(3,4,6);
     93    D.Add(4,3,6);
     94    D.Add(4,5,9);
     95    D.Add(5,0,14);
     96    D.Add(5,0,14);
     97    D.Add(5,4,9);
     98    D.dijkstra(0);
     99 
    100    for(int i=0;i<6;i++){
    101         cout<<D.get(i)<<endl;
    102    }
    103 
    104 }

    这个程序实现了如图所示图的最短距离的求得

  • 相关阅读:
    Effective C++ 33 避免遮掩继承而来的名称
    求子数组之和的最大值——编程之美 2.14 扩展问题 正确实现
    数据结构快速回顾——平衡二叉树 AVL (转)
    位运算符 优先级 折半搜索
    关于 二维数组指针
    C++中的单例模式(转)
    C# ThreadStart和ParameterizedThreadStart区别
    C# 实现数字字符串左补齐0的两种方法
    C# 窗口自适应窗口宽度和高度
    C# 在多线程环境中,进行安全遍历操作
  • 原文地址:https://www.cnblogs.com/ohyee/p/4680679.html
Copyright © 2011-2022 走看看