Dijkstra算法与实现--进阶篇

1. 本文主要集中使用最小堆
摘要由CSDN通过智能技术生成

1. 本文主要集中使用最小堆数据结构实现Dijkstra算法。

    首先, 将前文IsInS结构拆分为vector<int> S, vector<int>Q, 方便最小堆的实现,S也是可以删除的,修改后的代码如下

#include <iostream>   
#include <iostream>   
#include <vector>   
#include <stack>  
#include<algorithm>
#include "bheap.hpp"
using namespace std;  
  
  
int map[][6] = {                     //定义无向图,或者有向图  
    {0, 6, 3, INT_MAX, INT_MAX, INT_MAX},  
    {6, 0, 2, 5,INT_MAX, INT_MAX},  
    {3, 2, 0, 3,4, INT_MAX},  
    {INT_MAX,5, 3, 0, 2, 3},  
    {INT_MAX,INT_MAX, 4, 2, 0, 5}, 
 {INT_MAX,INT_MAX,INT_MAX,3,5,0}
}; 
void init(int num, int startVertex,int distance[], int prevVertex[], vector<int>& Q)
{
/*初始化distance和prevVertex数组*/ 
    for(int i =0; i < num; ++i)  
    {  
        distance[ i ] = map[ startVertex ][ i ];  //源节点到各个节点的距离,其中INT_MAX代表不可达
        if(map[ startVertex ][ i ] < INT_MAX)  //如果是可达的
            prevVertex[ i ] = startVertex;  
        else  
            prevVertex[ i ] = -1;       //表示还不知道前一个节点是什么   
    }  
    prevVertex[ startVertex ] = -1;  //源节点无前一个节点
 for(int i =0; i < num; ++i)
 {
  if(i != startVertex)
  {
   Q.push_back(i);
  }
 }
}
void extractMin(vector<int>& Q,int distance[],int& currentVertex)
{
      /*在Q中选择u到j的distance最小的一个节点, 如第一步A到C,最后目标到D*/   
        int minDistance = INT_MAX; 
  vector<int>::iterator ite = Q.begin();
        for(; ite!=Q.end();ite++)  //
        {  
            if((distance[*ite] < minDistance))//寻找初始currentVertexA到Q中distance最小的节点 最后为新的currentVertexC  
            {  
                currentVertex = *ite;  
                minDistance = distance[*ite];  
            }  
        } 
  return;
}
/*对这个新的currentVertexC做松弛计算,更新distance*/ 
void Relax(vector<int> Q,int distance[],int pre[],int& currentVertex)
{
 vector<int>::iterator ite = Q.begin();
 for(; ite!=Q.end();ite++) 
 {
  if (map[currentVertex][*ite] < INT_MAX)  //在Q中,有距离的为c->d,c->e, c->b
  {  
                int currentdist = distance[ currentVertex] + map[ currentVertex ][*ite];  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值